From 9e60b8a4de10822ecb22d404a38e21840f5ab821 Mon Sep 17 00:00:00 2001 From: Mattias Reichel Date: Mon, 8 Jun 2026 15:39:14 +0200 Subject: [PATCH 1/4] refactor: replace usages of deprecated external APIs Hibernate deprecations are excluded. --- .../internal/DelegateAsyncTransformation.java | 30 ++--- .../grails/async/DelegateAsyncSpec.groovy | 105 ++++++++++++++++++ .../grails/build/logging/GrailsConsole.java | 2 +- .../logging/GrailsConsoleAntBuilder.java | 2 +- .../org/grails/io/watch/DirectoryWatcher.java | 6 +- .../grails/web/converters/ConverterUtil.java | 2 +- .../json/GenericJavaBeanMarshaller.java | 2 +- .../xml/GenericJavaBeanMarshaller.java | 2 +- .../groovy/grails/util/GrailsClassUtils.java | 7 +- .../src/main/groovy/grails/util/Holders.java | 13 +-- .../AbstractGrailsArtefactTransformer.java | 4 +- .../compiler/injection/GrailsASTUtils.java | 6 +- .../GrailsAwareInjectionOperation.java | 7 +- .../org/grails/core/AbstractGrailsClass.java | 4 +- .../core/io/GrailsByteArrayResource.java | 8 +- .../BeanCreationProfilingPostProcessor.java | 4 +- .../grails/plugins/BinaryGrailsPlugin.java | 3 +- .../grails/plugins/DefaultGrailsPlugin.java | 5 +- .../spring/RuntimeSpringConfigUtilities.java | 6 +- .../orm/hibernate/cfg/GrailsDomainBinder.java | 7 +- .../hibernate5/ConfigurableJtaPlatform.java | 2 +- .../support/hibernate5/HibernateCallback.java | 3 +- .../HibernateExceptionTranslator.java | 2 +- .../hibernate5/HibernateJdbcException.java | 2 +- ...ernateObjectRetrievalFailureException.java | 2 +- .../hibernate5/HibernateOperations.java | 2 +- .../hibernate5/HibernateQueryException.java | 2 +- .../hibernate5/HibernateSystemException.java | 2 +- .../support/hibernate5/HibernateTemplate.java | 2 +- .../HibernateTransactionManager.java | 2 +- .../hibernate5/LocalSessionFactoryBean.java | 2 +- .../LocalSessionFactoryBuilder.java | 2 +- .../hibernate5/SessionFactoryUtils.java | 2 +- .../support/hibernate5/SessionHolder.java | 2 +- .../hibernate5/SpringBeanContainer.java | 2 +- .../SpringFlushSynchronization.java | 2 +- .../hibernate5/SpringSessionContext.java | 2 +- .../support/AsyncRequestInterceptor.java | 2 +- .../support/OpenSessionInViewInterceptor.java | 2 +- .../orm/hibernate/cfg/GrailsDomainBinder.java | 8 +- .../hibernate7/ConfigurableJtaPlatform.java | 2 +- .../support/hibernate7/HibernateCallback.java | 3 +- .../HibernateExceptionTranslator.java | 2 +- .../hibernate7/HibernateJdbcException.java | 2 +- ...ernateObjectRetrievalFailureException.java | 2 +- .../hibernate7/HibernateOperations.java | 2 +- .../hibernate7/HibernateQueryException.java | 2 +- .../hibernate7/HibernateSystemException.java | 2 +- .../support/hibernate7/HibernateTemplate.java | 2 +- .../HibernateTransactionManager.java | 2 +- .../hibernate7/LocalSessionFactoryBean.java | 2 +- .../LocalSessionFactoryBuilder.java | 2 +- .../hibernate7/SessionFactoryUtils.java | 2 +- .../support/hibernate7/SessionHolder.java | 2 +- .../hibernate7/SpringBeanContainer.java | 2 +- .../SpringFlushSynchronization.java | 2 +- .../hibernate7/SpringSessionContext.java | 2 +- .../support/AsyncRequestInterceptor.java | 2 +- .../support/OpenSessionInViewInterceptor.java | 2 +- .../constraints/AbstractConstraint.java | 3 +- .../constraints/EmailConstraint.java | 2 +- .../constraints/ScaleConstraint.java | 3 +- .../DelegateAsyncTransformation.java | 27 ----- .../model/AbstractPersistentEntity.java | 8 +- .../datastore/mapping/reflect/NameUtils.java | 4 +- .../services/DefaultServiceDefinition.java | 4 +- .../org/grails/buffer/GrailsPrintWriter.java | 3 +- .../org/grails/gsp/compiler/GSPWriter.java | 2 +- .../gsp/compiler/tags/GrailsTagRegistry.java | 5 +- .../Sitemesh3EnvironmentPostProcessor.java | 2 +- .../jsp/GroovyPagesJspApplicationContext.java | 2 +- .../grails/gsp/boot/GspAutoConfiguration.java | 2 +- .../command/run/SpringApplicationRunner.java | 3 +- .../grails/cli/compiler/GroovyCompiler.java | 3 +- .../org/grails/cli/util/ResourceUtils.java | 3 +- .../support/MockApplicationContext.java | 3 +- .../org/grails/web/json/JSONObject.java | 2 +- .../web/servlet/mvc/GrailsWebRequest.java | 3 +- .../web/databinding/DataBindingUtils.java | 12 +- .../grails/web/mapping/RegexUrlMapping.java | 4 +- .../main/java/grails/init/GrailsUpdater.java | 9 +- 81 files changed, 262 insertions(+), 158 deletions(-) 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 a776e0644dc..7ba30826f69 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 @@ -20,9 +20,7 @@ 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 groovy.lang.Closure; @@ -173,28 +171,14 @@ private void applyDelegateAsyncTransform(ClassNode classNode, ClassNode targetAp } private static ClassNode alignReturnType(final ClassNode receiver, final ClassNode originalReturnType) { - ClassNode copiedReturnType = originalReturnType.getPlainNodeReference(); - - List redirectTypes = new ArrayList<>(); - if (receiver.redirect().getGenericsTypes() != null) { - Collections.addAll(redirectTypes, receiver.redirect().getGenericsTypes()); + if (!originalReturnType.isUsingGenerics()) { + return originalReturnType.getPlainNodeReference(); } - if (!redirectTypes.isEmpty()) { - GenericsType[] redirectReceiverTypes = redirectTypes.toArray(new GenericsType[0]); - - GenericsType[] receiverParameterizedTypes = receiver.getGenericsTypes(); - if (receiverParameterizedTypes == null) { - receiverParameterizedTypes = redirectReceiverTypes; - } - - if (originalReturnType.isUsingGenerics()) { - GenericsType[] alignmentTypes = originalReturnType.getGenericsTypes(); - GenericsType[] genericsTypes = GenericsUtils.alignGenericTypes(redirectReceiverTypes, receiverParameterizedTypes, alignmentTypes); - copiedReturnType.setGenericsTypes(genericsTypes); - } - } - - return copiedReturnType; + var genericsSpec = GenericsUtils.createGenericsSpec(receiver); + var correctedReturnType = GenericsUtils.correctToGenericsSpecRecurse(genericsSpec, originalReturnType); + return correctedReturnType == null + ? originalReturnType.getPlainNodeReference() + : correctedReturnType; } protected DelegateAsyncTransactionalMethodTransformer lookupAsyncTransactionalMethodTransformer() { diff --git a/grails-async/core/src/test/groovy/grails/async/DelegateAsyncSpec.groovy b/grails-async/core/src/test/groovy/grails/async/DelegateAsyncSpec.groovy index 6ed9ea4d548..2504e748359 100644 --- a/grails-async/core/src/test/groovy/grails/async/DelegateAsyncSpec.groovy +++ b/grails-async/core/src/test/groovy/grails/async/DelegateAsyncSpec.groovy @@ -75,6 +75,92 @@ class DelegateAsyncSpec extends Specification { then: 'the decorator is applied to the value' val == 6 } + + void 'Delegate async transform preserves generic return type for static compilation'() { + when: + def result = new GroovyShell().evaluate(''' + import grails.async.* + import groovy.transform.CompileStatic + + class GenericService { + T echo(T value) { value } + } + + class AsyncStringService { + @DelegateAsync + GenericService service = new GenericService() + } + + @CompileStatic + String test() { + Promise p = new AsyncStringService().echo('hello') + p.get() + } + + test() + ''') + + then: + result == 'hello' + } + + void 'Delegate async transform aligns generic return type from inherited interface method'() { + when: + def service = new AsyncStringHolderService() + def p = service.get() + + then: + p instanceof Promise + + and: + p.get() == 'hello' + } + + void 'Delegate async transform preserves generic return type from inherited interface method for static compilation'() { + when: + def result = new GroovyShell().evaluate(''' + import grails.async.* + import groovy.transform.CompileStatic + + interface Holder { + T get() + } + + class StringHolder implements Holder { + @Override + String get() { + 'hello' + } + } + + @DelegateAsync(StringHolder) + class AsyncStringHolderService { + } + + @CompileStatic + String test() { + Promise p = new AsyncStringHolderService().get() + p.get() + } + + test() + ''') + + then: + result == 'hello' + } + + void 'Delegate async transform aligns generic return type from parameterized interface field'() { + when: + def service = new AsyncParameterizedHolderService() + def p = service.get() + + then: + p instanceof Promise + + and: + p.get() == 'hello' + } } class MathService { @@ -103,3 +189,22 @@ class AsyncMathService3 implements PromiseDecoratorProvider { ] } +interface Holder { + T get() +} + +class StringHolder implements Holder { + @Override + String get() { + 'hello' + } +} + +@DelegateAsync(StringHolder) +class AsyncStringHolderService { +} + +class AsyncParameterizedHolderService { + @DelegateAsync + Holder holder = new StringHolder() +} \ No newline at end of file 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 d779e9abd88..2641e487ff7 100644 --- a/grails-bootstrap/src/main/groovy/grails/build/logging/GrailsConsole.java +++ b/grails-bootstrap/src/main/groovy/grails/build/logging/GrailsConsole.java @@ -408,7 +408,7 @@ public static GrailsConsole createInstance() throws IOException { try { @SuppressWarnings("unchecked") Class klass = (Class) Class.forName(className); - return klass.newInstance(); + return klass.getDeclaredConstructor().newInstance(); } catch (Exception e) { e.printStackTrace(); } 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 42eea04d067..5f7f687c0cf 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 @@ -137,7 +137,7 @@ public void messageLogged(BuildEvent event) { } if (null != targetName) { - console.verbose(StringUtils.LINE_SEP + targetName + ":"); + console.verbose(System.lineSeparator() + targetName + ":"); targetName = null; } } 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 0f1593806cb..e2601a82bfe 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 @@ -59,12 +59,12 @@ public DirectoryWatcher() { } if (jnaAvailable) { - directoryWatcherDelegate = (AbstractDirectoryWatcher) Class.forName("org.grails.io.watch.MacOsWatchServiceDirectoryWatcher").newInstance(); + directoryWatcherDelegate = (AbstractDirectoryWatcher) Class.forName("org.grails.io.watch.MacOsWatchServiceDirectoryWatcher").getDeclaredConstructor().newInstance(); } else { - directoryWatcherDelegate = (AbstractDirectoryWatcher) Class.forName("org.grails.io.watch.WatchServiceDirectoryWatcher").newInstance(); + directoryWatcherDelegate = (AbstractDirectoryWatcher) Class.forName("org.grails.io.watch.WatchServiceDirectoryWatcher").getDeclaredConstructor().newInstance(); } } else { - directoryWatcherDelegate = (AbstractDirectoryWatcher) Class.forName("org.grails.io.watch.WatchServiceDirectoryWatcher").newInstance(); + directoryWatcherDelegate = (AbstractDirectoryWatcher) Class.forName("org.grails.io.watch.WatchServiceDirectoryWatcher").getDeclaredConstructor().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); 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 c12ed7842d3..b98a6746b92 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 @@ -73,7 +73,7 @@ public static Object createConverter(Class converterClass, Object target) thr public static T createConverter(Class converterClass, Object target, ApplicationContext applicationContext) throws ConverterException { try { - T converter = converterClass.newInstance(); + T converter = converterClass.getDeclaredConstructor().newInstance(); if (converter instanceof ApplicationContextAware && applicationContext != null) { ((ApplicationContextAware) converter).setApplicationContext(applicationContext); } 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 ca526be4789..03c0752ecb3 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 @@ -71,7 +71,7 @@ public void marshalObject(Object o, JSON json) throws ConverterException { } for (Field field : o.getClass().getDeclaredFields()) { int modifiers = field.getModifiers(); - if (field.isAccessible() && Modifier.isPublic(modifiers) && !(Modifier.isStatic(modifiers) || Modifier.isTransient(modifiers))) { + if (field.canAccess(o) && Modifier.isPublic(modifiers) && !(Modifier.isStatic(modifiers) || Modifier.isTransient(modifiers))) { String name = field.getName(); if (!shouldInclude(includeExcludeSupport, includes, excludes, o, name)) continue; writer.key(field.getName()); 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 f00d6966ed3..be6471e5ded 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 @@ -54,7 +54,7 @@ public void marshalObject(Object o, XML xml) throws ConverterException { } for (Field field : o.getClass().getDeclaredFields()) { int modifiers = field.getModifiers(); - if (field.isAccessible() && Modifier.isPublic(modifiers) && + if (field.canAccess(o) && Modifier.isPublic(modifiers) && !(Modifier.isStatic(modifiers) || Modifier.isTransient(modifiers))) { xml.startNode(field.getName()); xml.convertAnother(field.get(o)); diff --git a/grails-core/src/main/groovy/grails/util/GrailsClassUtils.java b/grails-core/src/main/groovy/grails/util/GrailsClassUtils.java index b3a34fdc4cd..600d10886f4 100644 --- a/grails-core/src/main/groovy/grails/util/GrailsClassUtils.java +++ b/grails-core/src/main/groovy/grails/util/GrailsClassUtils.java @@ -20,6 +20,7 @@ import java.beans.PropertyDescriptor; import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.ArrayList; @@ -952,7 +953,11 @@ public static Object instantiateFromFlatConfig(Map flatConfig, S if (configName instanceof CharSequence) { className = configName.toString(); } - return ClassUtils.forName(className, ClassUtils.getDefaultClassLoader()).newInstance(); + try { + return ClassUtils.forName(className, ClassUtils.getDefaultClassLoader()).getDeclaredConstructor().newInstance(); + } catch (InvocationTargetException | NoSuchMethodException e) { + throw new InstantiationException(); + } } /** diff --git a/grails-core/src/main/groovy/grails/util/Holders.java b/grails-core/src/main/groovy/grails/util/Holders.java index 91591866094..d83d4703fdb 100644 --- a/grails-core/src/main/groovy/grails/util/Holders.java +++ b/grails-core/src/main/groovy/grails/util/Holders.java @@ -18,6 +18,7 @@ */ package grails.util; +import java.lang.reflect.InvocationTargetException; import java.util.Collections; import java.util.List; import java.util.Map; @@ -220,17 +221,9 @@ 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.getDeclaredConstructor().newInstance(); } - catch (ClassNotFoundException e) { - // shouldn't happen - LOG.debug("Error initializing servlet context holder, not running in Servlet environment: " + e.getMessage(), e); - } - catch (InstantiationException e) { - // shouldn't happen - LOG.debug("Error initializing servlet context holder, not running in Servlet environment: " + e.getMessage(), e); - } - catch (IllegalAccessException e) { + catch (ClassNotFoundException | InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { // shouldn't happen LOG.debug("Error initializing servlet context holder, not running in Servlet environment: " + e.getMessage(), 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 dd13d41595c..834f106a6c3 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 @@ -28,6 +28,7 @@ import java.util.Set; import org.apache.groovy.ast.tools.AnnotatedNodeUtils; +import org.apache.groovy.util.BeanUtils; import org.codehaus.groovy.ast.AnnotationNode; import org.codehaus.groovy.ast.ClassHelper; import org.codehaus.groovy.ast.ClassNode; @@ -53,7 +54,6 @@ 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; @@ -344,7 +344,7 @@ protected void addApiLookupFieldAndSetter(ClassNode classNode, ClassNode impleme fieldNode = new FieldNode(apiProperty, Modifier.PRIVATE | Modifier.STATIC, implementationNode, classNode, initialValueExpression); classNode.addField(fieldNode); - String setterName = "set" + MetaClassHelper.capitalize(apiProperty); + String setterName = "set" + BeanUtils.capitalize(apiProperty); Parameter setterParameter = new Parameter(implementationNode, apiProperty); BlockStatement setterBody = new BlockStatement(); setterBody.addStatement(new ExpressionStatement(new BinaryExpression(new AttributeExpression( 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 66684cd4f3e..50157c4513b 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 @@ -43,6 +43,7 @@ import groovy.transform.TypeChecked; import groovy.transform.TypeCheckingMode; import org.apache.groovy.ast.tools.AnnotatedNodeUtils; +import org.apache.groovy.util.BeanUtils; import org.codehaus.groovy.ast.ASTNode; import org.codehaus.groovy.ast.AnnotatedNode; import org.codehaus.groovy.ast.AnnotationNode; @@ -84,7 +85,6 @@ import org.codehaus.groovy.control.Janitor; import org.codehaus.groovy.control.SourceUnit; import org.codehaus.groovy.control.messages.SyntaxErrorMessage; -import org.codehaus.groovy.runtime.MetaClassHelper; import org.codehaus.groovy.syntax.SyntaxException; import org.codehaus.groovy.syntax.Token; import org.codehaus.groovy.syntax.Types; @@ -1371,7 +1371,7 @@ public static MethodCallExpression buildGetPropertyExpression(final Expression o * @return The method call expression */ public static MethodCallExpression buildGetPropertyExpression(final Expression objectExpression, final String propertyName, final ClassNode targetClassNode, final boolean useBooleanGetter) { - String methodName = (useBooleanGetter ? "is" : "get") + MetaClassHelper.capitalize(propertyName); + String methodName = (useBooleanGetter ? "is" : "get") + BeanUtils.capitalize(propertyName); MethodCallExpression methodCallExpression = new MethodCallExpression(objectExpression, methodName, MethodCallExpression.NO_ARGUMENTS); MethodNode getterMethod = targetClassNode.getGetterMethod(methodName); if (getterMethod != null) { @@ -1390,7 +1390,7 @@ public static MethodCallExpression buildGetPropertyExpression(final Expression o * @return The method call expression */ public static MethodCallExpression buildSetPropertyExpression(final Expression objectExpression, final String propertyName, final ClassNode targetClassNode, final Expression valueExpression) { - String methodName = "set" + MetaClassHelper.capitalize(propertyName); + String methodName = "set" + BeanUtils.capitalize(propertyName); MethodCallExpression methodCallExpression = new MethodCallExpression(objectExpression, methodName, new ArgumentListExpression(valueExpression)); MethodNode setterMethod = targetClassNode.getSetterMethod(methodName); if (setterMethod != null) { 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 e3ecbf743ae..0b8606d5749 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 @@ -20,6 +20,7 @@ import java.io.IOException; import java.io.InputStream; +import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; @@ -55,7 +56,7 @@ * @author Graeme Rocher * @since 0.6 */ -public class GrailsAwareInjectionOperation extends CompilationUnit.PrimaryClassNodeOperation { +public class GrailsAwareInjectionOperation implements CompilationUnit.IPrimaryClassNodeOperation { private static final String INJECTOR_SCAN_PACKAGE = "org.grails.compiler"; private static final String INJECTOR_CODEHAUS_SCAN_PACKAGE = "org.codehaus.groovy.grails.compiler"; @@ -136,14 +137,14 @@ public AnnotationVisitor visitAnnotation(String desc, boolean visible) { if (ClassInjector.class.isAssignableFrom(injectorClass)) { injectorClasses.add(injectorClass); - ClassInjector classInjector = (ClassInjector) injectorClass.newInstance(); + ClassInjector classInjector = (ClassInjector) injectorClass.getDeclaredConstructor().newInstance(); injectors.add(classInjector); if (GlobalClassInjector.class.isAssignableFrom(injectorClass)) { globalInjectors.add(classInjector); } } } - } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) { + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { // ignore } return super.visitAnnotation(desc, visible); 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 760f80cb2bc..d16e6d7630b 100644 --- a/grails-core/src/main/groovy/org/grails/core/AbstractGrailsClass.java +++ b/grails-core/src/main/groovy/org/grails/core/AbstractGrailsClass.java @@ -116,10 +116,10 @@ public Class getClazz() { public Object newInstance() { try { Constructor defaultConstructor = getClazz().getDeclaredConstructor(new Class[]{}); - if (!defaultConstructor.isAccessible()) { + if (!defaultConstructor.canAccess(null)) { defaultConstructor.setAccessible(true); } - return defaultConstructor.newInstance(new Object[]{}); + return defaultConstructor.newInstance(); } catch (Exception e) { Throwable targetException; diff --git a/grails-core/src/main/groovy/org/grails/core/io/GrailsByteArrayResource.java b/grails-core/src/main/groovy/org/grails/core/io/GrailsByteArrayResource.java index 06c2c0ded5b..c7d704cb43f 100644 --- a/grails-core/src/main/groovy/org/grails/core/io/GrailsByteArrayResource.java +++ b/grails-core/src/main/groovy/org/grails/core/io/GrailsByteArrayResource.java @@ -19,6 +19,8 @@ package org.grails.core.io; import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; import org.springframework.core.io.ByteArrayResource; @@ -46,7 +48,11 @@ public GrailsByteArrayResource(byte[] byteArray, String location) { */ @Override public URL getURL() throws IOException { - return new URL("file", null, getDescription()); + try { + return new URI("file", null, getDescription(), null).toURL(); + } catch (URISyntaxException e) { + throw new IOException("Invalid fake file URL: " + getDescription(), e); + } } @Override 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 a7b3080d4c8..ec2c76d5def 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 @@ -18,6 +18,8 @@ */ package org.grails.core.util; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,8 +27,6 @@ import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; -import org.springframework.lang.NonNull; -import org.springframework.lang.Nullable; /** * Adds timings of bean creation times logged to the "org.grails.startup" group 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 76d6b2d6472..73c228d6396 100644 --- a/grails-core/src/main/groovy/org/grails/plugins/BinaryGrailsPlugin.java +++ b/grails-core/src/main/groovy/org/grails/plugins/BinaryGrailsPlugin.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.net.URI; import java.net.URL; import java.nio.charset.Charset; import java.util.ArrayList; @@ -135,7 +136,7 @@ protected void initializeViewMap(PluginDescriptor descriptor) { String urlString = descriptorResource.getURL().toString(); if (urlString.endsWith(PLUGIN_DESCRIPTOR_PATH)) { urlString = urlString.substring(0, urlString.length() - PLUGIN_DESCRIPTOR_PATH.length()); - URL newUrl = new URL(urlString + RELATIVE_VIEWS_PROPERTIES); + URL newUrl = URI.create(urlString + RELATIVE_VIEWS_PROPERTIES).toURL(); viewsPropertiesResource = new UrlResource(newUrl); } } catch (IOException e) { 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 a4fe202df21..8064850d832 100644 --- a/grails-core/src/main/groovy/org/grails/plugins/DefaultGrailsPlugin.java +++ b/grails-core/src/main/groovy/org/grails/plugins/DefaultGrailsPlugin.java @@ -20,6 +20,7 @@ import java.io.File; import java.io.IOException; +import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -673,9 +674,9 @@ public void doArtefactConfiguration() { Class artefactClass = (Class) artefact; if (ArtefactHandler.class.isAssignableFrom(artefactClass)) { try { - grailsApplication.registerArtefactHandler((ArtefactHandler) artefactClass.newInstance()); + grailsApplication.registerArtefactHandler((ArtefactHandler) artefactClass.getDeclaredConstructor().newInstance()); } - catch (InstantiationException e) { + catch (InstantiationException | InvocationTargetException | NoSuchMethodException e) { LOG.error("Cannot instantiate an Artefact Handler:" + e.getMessage(), e); } catch (IllegalAccessException e) { 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 3a964f25700..563f10c5bc2 100644 --- a/grails-core/src/main/groovy/org/grails/spring/RuntimeSpringConfigUtilities.java +++ b/grails-core/src/main/groovy/org/grails/spring/RuntimeSpringConfigUtilities.java @@ -18,6 +18,8 @@ */ package org.grails.spring; +import java.lang.reflect.InvocationTargetException; + import groovy.lang.Binding; import groovy.lang.Closure; import groovy.lang.Script; @@ -95,12 +97,12 @@ public static void loadExternalSpringConfig(RuntimeSpringConfiguration config, f } } - public static BeanBuilder reloadSpringResourcesConfig(RuntimeSpringConfiguration config, GrailsApplication application, Class groovySpringResourcesClass) throws InstantiationException, IllegalAccessException { + public static BeanBuilder reloadSpringResourcesConfig(RuntimeSpringConfiguration config, GrailsApplication application, Class groovySpringResourcesClass) throws InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { 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 script = (Script) groovySpringResourcesClass.getDeclaredConstructor().newInstance(); script.run(); Object beans = script.getProperty("beans"); springGroovyResourcesBeanBuilder.beans((Closure) beans); 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 1c5715728c5..10b22c79424 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,6 +18,7 @@ */ package org.grails.orm.hibernate.cfg; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.math.BigInteger; import java.nio.charset.StandardCharsets; @@ -254,7 +255,11 @@ else if (strategy instanceof CharSequence) { namingStrategy = (NamingStrategy) strategy; } else { - namingStrategy = (NamingStrategy) namingStrategyClass.newInstance(); + try { + namingStrategy = (NamingStrategy) namingStrategyClass.getDeclaredConstructor().newInstance(); + } catch(NoSuchMethodException | InvocationTargetException e) { + throw new InstantiationException("Failed to instantiate naming strategy [" + strategy + "]: " + e.getMessage()); + } } NAMING_STRATEGIES.put(datasourceName, namingStrategy); diff --git a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/ConfigurableJtaPlatform.java b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/ConfigurableJtaPlatform.java index f5a6ae43990..997bee9d3fa 100644 --- a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/ConfigurableJtaPlatform.java +++ b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/ConfigurableJtaPlatform.java @@ -26,8 +26,8 @@ import org.hibernate.TransactionException; import org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform; +import org.jspecify.annotations.Nullable; -import org.springframework.lang.Nullable; import org.springframework.transaction.jta.UserTransactionAdapter; import org.springframework.util.Assert; diff --git a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateCallback.java b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateCallback.java index dcd07a641e7..c25a8743c51 100644 --- a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateCallback.java +++ b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateCallback.java @@ -18,8 +18,7 @@ import org.hibernate.HibernateException; import org.hibernate.Session; - -import org.springframework.lang.Nullable; +import org.jspecify.annotations.Nullable; /** * Callback interface for Hibernate code. To be used with {@link HibernateTemplate}'s diff --git a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateExceptionTranslator.java b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateExceptionTranslator.java index d6e60d3a70c..d654f8e0db0 100644 --- a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateExceptionTranslator.java +++ b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateExceptionTranslator.java @@ -20,11 +20,11 @@ import org.hibernate.HibernateException; import org.hibernate.JDBCException; +import org.jspecify.annotations.Nullable; import org.springframework.dao.DataAccessException; import org.springframework.dao.support.PersistenceExceptionTranslator; import org.springframework.jdbc.support.SQLExceptionTranslator; -import org.springframework.lang.Nullable; import org.springframework.orm.jpa.EntityManagerFactoryUtils; /** diff --git a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateJdbcException.java b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateJdbcException.java index fb960b28658..5663c061a60 100644 --- a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateJdbcException.java +++ b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateJdbcException.java @@ -19,9 +19,9 @@ import java.sql.SQLException; import org.hibernate.JDBCException; +import org.jspecify.annotations.Nullable; import org.springframework.dao.UncategorizedDataAccessException; -import org.springframework.lang.Nullable; /** * Hibernate-specific subclass of UncategorizedDataAccessException, diff --git a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateObjectRetrievalFailureException.java b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateObjectRetrievalFailureException.java index e7918498b91..9edb5b8753d 100644 --- a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateObjectRetrievalFailureException.java +++ b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateObjectRetrievalFailureException.java @@ -19,8 +19,8 @@ import org.hibernate.HibernateException; import org.hibernate.UnresolvableObjectException; import org.hibernate.WrongClassException; +import org.jspecify.annotations.Nullable; -import org.springframework.lang.Nullable; import org.springframework.orm.ObjectRetrievalFailureException; import org.springframework.util.ReflectionUtils; diff --git a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateOperations.java b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateOperations.java index 3dfc8eb4ffe..71e7df5523a 100644 --- a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateOperations.java +++ b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateOperations.java @@ -25,9 +25,9 @@ import org.hibernate.LockMode; import org.hibernate.ReplicationMode; import org.hibernate.criterion.DetachedCriteria; +import org.jspecify.annotations.Nullable; import org.springframework.dao.DataAccessException; -import org.springframework.lang.Nullable; /** * Interface that specifies a common set of Hibernate operations as well as diff --git a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateQueryException.java b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateQueryException.java index f1e7480464c..50c2d49413b 100644 --- a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateQueryException.java +++ b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateQueryException.java @@ -17,9 +17,9 @@ package org.grails.orm.hibernate.support.hibernate5; import org.hibernate.QueryException; +import org.jspecify.annotations.Nullable; import org.springframework.dao.InvalidDataAccessResourceUsageException; -import org.springframework.lang.Nullable; /** * Hibernate-specific subclass of InvalidDataAccessResourceUsageException, diff --git a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateSystemException.java b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateSystemException.java index be1cd04c3c8..bbe6c949bd5 100644 --- a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateSystemException.java +++ b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateSystemException.java @@ -17,9 +17,9 @@ package org.grails.orm.hibernate.support.hibernate5; import org.hibernate.HibernateException; +import org.jspecify.annotations.Nullable; import org.springframework.dao.UncategorizedDataAccessException; -import org.springframework.lang.Nullable; /** * Hibernate-specific subclass of UncategorizedDataAccessException, diff --git a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateTemplate.java b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateTemplate.java index 2fb5eac00de..8c17efb37d6 100644 --- a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateTemplate.java +++ b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateTemplate.java @@ -42,11 +42,11 @@ import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.Example; import org.hibernate.query.Query; +import org.jspecify.annotations.Nullable; import org.springframework.beans.factory.InitializingBean; import org.springframework.dao.DataAccessException; import org.springframework.dao.InvalidDataAccessApiUsageException; -import org.springframework.lang.Nullable; import org.springframework.transaction.support.ResourceHolderSupport; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.util.Assert; diff --git a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateTransactionManager.java b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateTransactionManager.java index 58eca50fa6b..146268d1a22 100644 --- a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateTransactionManager.java +++ b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/HibernateTransactionManager.java @@ -33,6 +33,7 @@ import org.hibernate.Transaction; import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.resource.transaction.spi.TransactionStatus; +import org.jspecify.annotations.Nullable; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; @@ -44,7 +45,6 @@ import org.springframework.jdbc.datasource.DataSourceUtils; import org.springframework.jdbc.datasource.JdbcTransactionObjectSupport; import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy; -import org.springframework.lang.Nullable; import org.springframework.transaction.CannotCreateTransactionException; import org.springframework.transaction.IllegalTransactionStateException; import org.springframework.transaction.InvalidIsolationLevelException; diff --git a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/LocalSessionFactoryBean.java b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/LocalSessionFactoryBean.java index cc8a7223356..98e7a8c8b7d 100644 --- a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/LocalSessionFactoryBean.java +++ b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/LocalSessionFactoryBean.java @@ -33,6 +33,7 @@ import org.hibernate.context.spi.CurrentTenantIdentifierResolver; import org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider; import org.hibernate.integrator.spi.Integrator; +import org.jspecify.annotations.Nullable; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; @@ -51,7 +52,6 @@ import org.springframework.core.io.support.ResourcePatternUtils; import org.springframework.core.task.AsyncTaskExecutor; import org.springframework.core.type.filter.TypeFilter; -import org.springframework.lang.Nullable; /** * {@link FactoryBean} that creates a Hibernate {@link SessionFactory}. This is the usual diff --git a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/LocalSessionFactoryBuilder.java b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/LocalSessionFactoryBuilder.java index 30069b5211c..b0e836b6d8a 100644 --- a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/LocalSessionFactoryBuilder.java +++ b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/LocalSessionFactoryBuilder.java @@ -50,6 +50,7 @@ import org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.resource.jdbc.spi.PhysicalConnectionHandlingMode; +import org.jspecify.annotations.Nullable; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.core.InfrastructureProxy; @@ -66,7 +67,6 @@ import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.core.type.filter.AnnotationTypeFilter; import org.springframework.core.type.filter.TypeFilter; -import org.springframework.lang.Nullable; import org.springframework.transaction.jta.JtaTransactionManager; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; diff --git a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/SessionFactoryUtils.java b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/SessionFactoryUtils.java index 91db9b1fbbb..98be415e8a5 100644 --- a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/SessionFactoryUtils.java +++ b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/SessionFactoryUtils.java @@ -53,6 +53,7 @@ import org.hibernate.exception.LockAcquisitionException; import org.hibernate.exception.SQLGrammarException; import org.hibernate.service.UnknownServiceException; +import org.jspecify.annotations.Nullable; import org.springframework.dao.CannotAcquireLockException; import org.springframework.dao.DataAccessException; @@ -64,7 +65,6 @@ import org.springframework.dao.InvalidDataAccessResourceUsageException; import org.springframework.dao.PessimisticLockingFailureException; import org.springframework.jdbc.datasource.DataSourceUtils; -import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils; diff --git a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/SessionHolder.java b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/SessionHolder.java index cc79927ed4e..120d9b0ecc1 100644 --- a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/SessionHolder.java +++ b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/SessionHolder.java @@ -19,8 +19,8 @@ import org.hibernate.FlushMode; import org.hibernate.Session; import org.hibernate.Transaction; +import org.jspecify.annotations.Nullable; -import org.springframework.lang.Nullable; import org.springframework.orm.jpa.EntityManagerHolder; /** diff --git a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/SpringBeanContainer.java b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/SpringBeanContainer.java index f58c4714631..b281a61969d 100644 --- a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/SpringBeanContainer.java +++ b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/SpringBeanContainer.java @@ -25,12 +25,12 @@ import org.hibernate.resource.beans.container.spi.ContainedBean; import org.hibernate.resource.beans.spi.BeanInstanceProducer; import org.hibernate.type.spi.TypeBootstrapContext; +import org.jspecify.annotations.Nullable; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanCreationException; import org.springframework.beans.factory.config.AutowireCapableBeanFactory; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; -import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ConcurrentReferenceHashMap; diff --git a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/SpringFlushSynchronization.java b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/SpringFlushSynchronization.java index 798498862a3..5c2d648567b 100644 --- a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/SpringFlushSynchronization.java +++ b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/SpringFlushSynchronization.java @@ -17,8 +17,8 @@ package org.grails.orm.hibernate.support.hibernate5; import org.hibernate.Session; +import org.jspecify.annotations.Nullable; -import org.springframework.lang.Nullable; import org.springframework.transaction.support.TransactionSynchronization; /** diff --git a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/SpringSessionContext.java b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/SpringSessionContext.java index 163cf315395..800174f9f54 100644 --- a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/SpringSessionContext.java +++ b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/SpringSessionContext.java @@ -27,8 +27,8 @@ import org.hibernate.context.spi.CurrentSessionContext; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform; +import org.jspecify.annotations.Nullable; -import org.springframework.lang.Nullable; import org.springframework.orm.jpa.EntityManagerHolder; import org.springframework.transaction.support.TransactionSynchronizationManager; diff --git a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/support/AsyncRequestInterceptor.java b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/support/AsyncRequestInterceptor.java index 7298b926204..89d54fa39f5 100644 --- a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/support/AsyncRequestInterceptor.java +++ b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/support/AsyncRequestInterceptor.java @@ -21,8 +21,8 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.SessionFactory; +import org.jspecify.annotations.Nullable; -import org.springframework.lang.Nullable; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.context.request.async.CallableProcessingInterceptor; diff --git a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/support/OpenSessionInViewInterceptor.java b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/support/OpenSessionInViewInterceptor.java index 44a02a9fc13..dce2d5f6802 100644 --- a/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/support/OpenSessionInViewInterceptor.java +++ b/grails-data-hibernate5/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate5/support/OpenSessionInViewInterceptor.java @@ -22,10 +22,10 @@ import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; +import org.jspecify.annotations.Nullable; import org.springframework.dao.DataAccessException; import org.springframework.dao.DataAccessResourceFailureException; -import org.springframework.lang.Nullable; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.ui.ModelMap; import org.springframework.util.Assert; diff --git a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java index 1c5715728c5..8e721e0ade6 100644 --- a/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java +++ b/grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java @@ -18,6 +18,7 @@ */ package org.grails.orm.hibernate.cfg; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.math.BigInteger; import java.nio.charset.StandardCharsets; @@ -254,7 +255,12 @@ else if (strategy instanceof CharSequence) { namingStrategy = (NamingStrategy) strategy; } else { - namingStrategy = (NamingStrategy) namingStrategyClass.newInstance(); + try { + namingStrategy = (NamingStrategy) namingStrategyClass.getDeclaredConstructor().newInstance(); + } catch (NoSuchMethodException | InvocationTargetException e) { + throw new InstantiationException("Failed to instantiate naming strategy [" + strategy + "]. No default constructor found: " + e.getMessage()); + } + } NAMING_STRATEGIES.put(datasourceName, namingStrategy); diff --git a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/ConfigurableJtaPlatform.java b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/ConfigurableJtaPlatform.java index 8003c20bf99..ccab36aa83c 100644 --- a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/ConfigurableJtaPlatform.java +++ b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/ConfigurableJtaPlatform.java @@ -26,8 +26,8 @@ import org.hibernate.TransactionException; import org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform; +import org.jspecify.annotations.Nullable; -import org.springframework.lang.Nullable; import org.springframework.transaction.jta.UserTransactionAdapter; import org.springframework.util.Assert; diff --git a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateCallback.java b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateCallback.java index 5a656af389a..3ddb30d0c09 100644 --- a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateCallback.java +++ b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateCallback.java @@ -18,8 +18,7 @@ import org.hibernate.HibernateException; import org.hibernate.Session; - -import org.springframework.lang.Nullable; +import org.jspecify.annotations.Nullable; /** * Callback interface for Hibernate code. To be used with {@link HibernateTemplate}'s diff --git a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateExceptionTranslator.java b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateExceptionTranslator.java index 3ca846228aa..55ab53c5683 100644 --- a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateExceptionTranslator.java +++ b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateExceptionTranslator.java @@ -20,11 +20,11 @@ import org.hibernate.HibernateException; import org.hibernate.JDBCException; +import org.jspecify.annotations.Nullable; import org.springframework.dao.DataAccessException; import org.springframework.dao.support.PersistenceExceptionTranslator; import org.springframework.jdbc.support.SQLExceptionTranslator; -import org.springframework.lang.Nullable; import org.springframework.orm.jpa.EntityManagerFactoryUtils; /** diff --git a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateJdbcException.java b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateJdbcException.java index 4b1fa37c482..c9affdd1da8 100644 --- a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateJdbcException.java +++ b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateJdbcException.java @@ -19,9 +19,9 @@ import java.sql.SQLException; import org.hibernate.JDBCException; +import org.jspecify.annotations.Nullable; import org.springframework.dao.UncategorizedDataAccessException; -import org.springframework.lang.Nullable; /** * Hibernate-specific subclass of UncategorizedDataAccessException, diff --git a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateObjectRetrievalFailureException.java b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateObjectRetrievalFailureException.java index 28f9770f9e2..7cf8b32ab12 100644 --- a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateObjectRetrievalFailureException.java +++ b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateObjectRetrievalFailureException.java @@ -19,8 +19,8 @@ import org.hibernate.HibernateException; import org.hibernate.UnresolvableObjectException; import org.hibernate.WrongClassException; +import org.jspecify.annotations.Nullable; -import org.springframework.lang.Nullable; import org.springframework.orm.ObjectRetrievalFailureException; import org.springframework.util.ReflectionUtils; diff --git a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateOperations.java b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateOperations.java index 1aff542ff7b..f496a696866 100644 --- a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateOperations.java +++ b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateOperations.java @@ -25,9 +25,9 @@ import org.hibernate.LockMode; import org.hibernate.ReplicationMode; import org.hibernate.criterion.DetachedCriteria; +import org.jspecify.annotations.Nullable; import org.springframework.dao.DataAccessException; -import org.springframework.lang.Nullable; /** * Interface that specifies a common set of Hibernate operations as well as diff --git a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateQueryException.java b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateQueryException.java index 21a5545b6d7..03a2bf27121 100644 --- a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateQueryException.java +++ b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateQueryException.java @@ -17,9 +17,9 @@ package org.grails.orm.hibernate.support.hibernate7; import org.hibernate.QueryException; +import org.jspecify.annotations.Nullable; import org.springframework.dao.InvalidDataAccessResourceUsageException; -import org.springframework.lang.Nullable; /** * Hibernate-specific subclass of InvalidDataAccessResourceUsageException, diff --git a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateSystemException.java b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateSystemException.java index 4dce6f894f6..dbfadb0d78a 100644 --- a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateSystemException.java +++ b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateSystemException.java @@ -17,9 +17,9 @@ package org.grails.orm.hibernate.support.hibernate7; import org.hibernate.HibernateException; +import org.jspecify.annotations.Nullable; import org.springframework.dao.UncategorizedDataAccessException; -import org.springframework.lang.Nullable; /** * Hibernate-specific subclass of UncategorizedDataAccessException, diff --git a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateTemplate.java b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateTemplate.java index ba79a6f6615..2eef6429833 100644 --- a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateTemplate.java +++ b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateTemplate.java @@ -42,11 +42,11 @@ import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.Example; import org.hibernate.query.Query; +import org.jspecify.annotations.Nullable; import org.springframework.beans.factory.InitializingBean; import org.springframework.dao.DataAccessException; import org.springframework.dao.InvalidDataAccessApiUsageException; -import org.springframework.lang.Nullable; import org.springframework.transaction.support.ResourceHolderSupport; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.util.Assert; diff --git a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateTransactionManager.java b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateTransactionManager.java index f3d1a19ec6f..692ebda8f1a 100644 --- a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateTransactionManager.java +++ b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/HibernateTransactionManager.java @@ -33,6 +33,7 @@ import org.hibernate.Transaction; import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.resource.transaction.spi.TransactionStatus; +import org.jspecify.annotations.Nullable; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; @@ -44,7 +45,6 @@ import org.springframework.jdbc.datasource.DataSourceUtils; import org.springframework.jdbc.datasource.JdbcTransactionObjectSupport; import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy; -import org.springframework.lang.Nullable; import org.springframework.transaction.CannotCreateTransactionException; import org.springframework.transaction.IllegalTransactionStateException; import org.springframework.transaction.InvalidIsolationLevelException; diff --git a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/LocalSessionFactoryBean.java b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/LocalSessionFactoryBean.java index 96074988226..63b0769bca6 100644 --- a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/LocalSessionFactoryBean.java +++ b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/LocalSessionFactoryBean.java @@ -33,6 +33,7 @@ import org.hibernate.context.spi.CurrentTenantIdentifierResolver; import org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider; import org.hibernate.integrator.spi.Integrator; +import org.jspecify.annotations.Nullable; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; @@ -51,7 +52,6 @@ import org.springframework.core.io.support.ResourcePatternUtils; import org.springframework.core.task.AsyncTaskExecutor; import org.springframework.core.type.filter.TypeFilter; -import org.springframework.lang.Nullable; /** * {@link FactoryBean} that creates a Hibernate {@link SessionFactory}. This is the usual diff --git a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/LocalSessionFactoryBuilder.java b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/LocalSessionFactoryBuilder.java index cf898978d08..ddcc785a6db 100644 --- a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/LocalSessionFactoryBuilder.java +++ b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/LocalSessionFactoryBuilder.java @@ -50,6 +50,7 @@ import org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.resource.jdbc.spi.PhysicalConnectionHandlingMode; +import org.jspecify.annotations.Nullable; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.core.InfrastructureProxy; @@ -66,7 +67,6 @@ import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.core.type.filter.AnnotationTypeFilter; import org.springframework.core.type.filter.TypeFilter; -import org.springframework.lang.Nullable; import org.springframework.transaction.jta.JtaTransactionManager; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; diff --git a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/SessionFactoryUtils.java b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/SessionFactoryUtils.java index c1de4f0392f..e8edd14ff99 100644 --- a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/SessionFactoryUtils.java +++ b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/SessionFactoryUtils.java @@ -53,6 +53,7 @@ import org.hibernate.exception.LockAcquisitionException; import org.hibernate.exception.SQLGrammarException; import org.hibernate.service.UnknownServiceException; +import org.jspecify.annotations.Nullable; import org.springframework.dao.CannotAcquireLockException; import org.springframework.dao.DataAccessException; @@ -64,7 +65,6 @@ import org.springframework.dao.InvalidDataAccessResourceUsageException; import org.springframework.dao.PessimisticLockingFailureException; import org.springframework.jdbc.datasource.DataSourceUtils; -import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils; diff --git a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/SessionHolder.java b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/SessionHolder.java index a2759eeee8b..df1bb454b49 100644 --- a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/SessionHolder.java +++ b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/SessionHolder.java @@ -20,7 +20,7 @@ import org.hibernate.Session; import org.hibernate.Transaction; -import org.springframework.lang.Nullable; +import org.jspecify.annotations.Nullable; import org.springframework.orm.jpa.EntityManagerHolder; /** diff --git a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/SpringBeanContainer.java b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/SpringBeanContainer.java index 9324ad643b7..46166e03fb9 100644 --- a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/SpringBeanContainer.java +++ b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/SpringBeanContainer.java @@ -25,12 +25,12 @@ import org.hibernate.resource.beans.container.spi.ContainedBean; import org.hibernate.resource.beans.spi.BeanInstanceProducer; import org.hibernate.type.spi.TypeBootstrapContext; +import org.jspecify.annotations.Nullable; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanCreationException; import org.springframework.beans.factory.config.AutowireCapableBeanFactory; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; -import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ConcurrentReferenceHashMap; diff --git a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/SpringFlushSynchronization.java b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/SpringFlushSynchronization.java index d48c4c265de..253858e2a06 100644 --- a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/SpringFlushSynchronization.java +++ b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/SpringFlushSynchronization.java @@ -17,8 +17,8 @@ package org.grails.orm.hibernate.support.hibernate7; import org.hibernate.Session; +import org.jspecify.annotations.Nullable; -import org.springframework.lang.Nullable; import org.springframework.transaction.support.TransactionSynchronization; /** diff --git a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/SpringSessionContext.java b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/SpringSessionContext.java index 6b01f84574b..3e6e3900030 100644 --- a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/SpringSessionContext.java +++ b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/SpringSessionContext.java @@ -27,8 +27,8 @@ import org.hibernate.context.spi.CurrentSessionContext; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform; +import org.jspecify.annotations.Nullable; -import org.springframework.lang.Nullable; import org.springframework.orm.jpa.EntityManagerHolder; import org.springframework.transaction.support.TransactionSynchronizationManager; diff --git a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/support/AsyncRequestInterceptor.java b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/support/AsyncRequestInterceptor.java index 98c21f1fe4f..1f79498e5a4 100644 --- a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/support/AsyncRequestInterceptor.java +++ b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/support/AsyncRequestInterceptor.java @@ -21,8 +21,8 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.SessionFactory; +import org.jspecify.annotations.Nullable; -import org.springframework.lang.Nullable; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.context.request.async.CallableProcessingInterceptor; diff --git a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/support/OpenSessionInViewInterceptor.java b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/support/OpenSessionInViewInterceptor.java index 595d6f56a6d..4114c199a05 100644 --- a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/support/OpenSessionInViewInterceptor.java +++ b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/support/OpenSessionInViewInterceptor.java @@ -22,10 +22,10 @@ import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; +import org.jspecify.annotations.Nullable; import org.springframework.dao.DataAccessException; import org.springframework.dao.DataAccessResourceFailureException; -import org.springframework.lang.Nullable; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.ui.ModelMap; import org.springframework.util.Assert; 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 6f12a656822..85dc3157f82 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 @@ -30,6 +30,7 @@ import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.core.style.ToStringCreator; import org.springframework.util.Assert; +import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; import org.springframework.validation.BindingResult; import org.springframework.validation.Errors; @@ -100,7 +101,7 @@ public void validate(Object target, Object propertyValue, Errors errors) { } // Skip blank values if desired. - if (skipBlankValues() && propertyValue instanceof String && StringUtils.isEmpty(propertyValue)) { + if (skipBlankValues() && propertyValue instanceof String && ObjectUtils.isEmpty(propertyValue)) { return; } 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 c9f688a75b3..78968a57546 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 @@ -75,7 +75,7 @@ protected void processValidate(Object target, Object propertyValue, Errors error EmailValidator emailValidator = EmailValidator.getInstance(); Object[] args = new Object[] { constraintPropertyName, constraintOwningClass, propertyValue }; String value = propertyValue.toString(); - if (StringUtils.isEmpty(value)) { + if (!StringUtils.hasLength(value)) { return; } 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 2a70a3179f4..98b3b98a811 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 @@ -20,6 +20,7 @@ package org.grails.datastore.gorm.validation.constraints; import java.math.BigDecimal; +import java.math.RoundingMode; import org.springframework.beans.BeanWrapper; import org.springframework.beans.BeanWrapperImpl; @@ -143,7 +144,7 @@ else if (propertyValue instanceof BigDecimal) { */ private BigDecimal getScaledValue(BigDecimal originalValue) { if (originalValue.scale() > scale) { - return originalValue.setScale(scale, BigDecimal.ROUND_HALF_UP); + return originalValue.setScale(scale, RoundingMode.HALF_UP); } return originalValue; } 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 11e20dbad36..f7042f25e23 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 @@ -23,7 +23,6 @@ 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; @@ -182,32 +181,6 @@ private List genericPlaceholderNames(MethodNode candidate) { return names; } - private static ClassNode alignReturnType(final ClassNode receiver, final ClassNode originalReturnType) { - ClassNode copiedReturnType = originalReturnType.getPlainNodeReference(); - - ClassNode actualReceiver = receiver; - 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) { - receiverParameterizedTypes = redirectReceiverTypes; - } - - if (originalReturnType.isUsingGenerics()) { - GenericsType[] alignmentTypes = originalReturnType.getGenericsTypes(); - GenericsType[] genericsTypes = GenericsUtils.alignGenericTypes(redirectReceiverTypes, receiverParameterizedTypes, alignmentTypes); - copiedReturnType.setGenericsTypes(genericsTypes); - } - } - - 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/model/AbstractPersistentEntity.java b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/AbstractPersistentEntity.java index fe8562dbb58..bc9787f5f76 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/AbstractPersistentEntity.java +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/AbstractPersistentEntity.java @@ -21,6 +21,7 @@ import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.annotation.Annotation; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.Arrays; @@ -351,11 +352,8 @@ public Entity getMappedForm() { public Object newInstance() { try { - return getJavaClass().newInstance(); - } catch (InstantiationException e) { - throw new EntityCreationException("Unable to create entity of type [" + getJavaClass().getName() + - "]: " + e.getMessage(), e); - } catch (IllegalAccessException e) { + return getJavaClass().getDeclaredConstructor().newInstance(); + } catch (InstantiationException | InvocationTargetException | NoSuchMethodException | IllegalAccessException e) { throw new EntityCreationException("Unable to create entity of type [" + getJavaClass().getName() + "]: " + e.getMessage(), e); } diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/reflect/NameUtils.java b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/reflect/NameUtils.java index c831c62f4ff..d3a988c7319 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/reflect/NameUtils.java +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/reflect/NameUtils.java @@ -20,7 +20,7 @@ import java.util.HashSet; import java.util.Set; -import org.codehaus.groovy.runtime.MetaClassHelper; +import org.apache.groovy.util.BeanUtils; import org.grails.datastore.mapping.model.config.GormProperties; @@ -158,6 +158,6 @@ public static String decapitalizeFirstChar(String name) { * @return The class name */ public static String capitalize(String name) { - return MetaClassHelper.capitalize(name); + return BeanUtils.capitalize(name); } } diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/services/DefaultServiceDefinition.java b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/services/DefaultServiceDefinition.java index cec56616ff5..0a13e4845aa 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/services/DefaultServiceDefinition.java +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/services/DefaultServiceDefinition.java @@ -62,7 +62,7 @@ public boolean isPresent() { public S orElseThrow(Supplier exceptionSupplier) throws X { final Class type = loadedClass.orElseThrow(exceptionSupplier); try { - return type.newInstance(); + return type.getDeclaredConstructor().newInstance(); } catch (Throwable e) { throw exceptionSupplier.get(); } @@ -72,7 +72,7 @@ public S orElseThrow(Supplier exceptionSuppli public S load() { return loadedClass.map(aClass -> { try { - return aClass.newInstance(); + return aClass.getDeclaredConstructor().newInstance(); } catch (Throwable e) { throw new ServiceConfigurationError("Error loading service [" + aClass.getName() + "]: " + e.getMessage(), e); } diff --git a/grails-encoder/src/main/groovy/org/grails/buffer/GrailsPrintWriter.java b/grails-encoder/src/main/groovy/org/grails/buffer/GrailsPrintWriter.java index 08fac4e59cd..a387f9ac9ab 100644 --- a/grails-encoder/src/main/groovy/org/grails/buffer/GrailsPrintWriter.java +++ b/grails-encoder/src/main/groovy/org/grails/buffer/GrailsPrintWriter.java @@ -25,6 +25,7 @@ import groovy.lang.GroovyObject; import groovy.lang.MetaClass; import groovy.lang.Writable; +import org.codehaus.groovy.runtime.FormatHelper; import org.codehaus.groovy.runtime.GStringImpl; import org.codehaus.groovy.runtime.InvokerHelper; import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation; @@ -133,7 +134,7 @@ else if (obj instanceof CharSequence) { } } else { - InvokerHelper.write(this, obj); + FormatHelper.write(this, obj); } return this; } diff --git a/grails-gsp/core/src/main/groovy/org/grails/gsp/compiler/GSPWriter.java b/grails-gsp/core/src/main/groovy/org/grails/gsp/compiler/GSPWriter.java index c73177eaf63..fbd34264952 100644 --- a/grails-gsp/core/src/main/groovy/org/grails/gsp/compiler/GSPWriter.java +++ b/grails-gsp/core/src/main/groovy/org/grails/gsp/compiler/GSPWriter.java @@ -53,7 +53,7 @@ public void printlnToResponse(String s) { } public void printlnToResponse(String outVarName, String s) { - if (GrailsStringUtils.isEmpty(s)) { + if (!GrailsStringUtils.hasLength(s)) { return; } diff --git a/grails-gsp/core/src/main/groovy/org/grails/gsp/compiler/tags/GrailsTagRegistry.java b/grails-gsp/core/src/main/groovy/org/grails/gsp/compiler/tags/GrailsTagRegistry.java index 1fde4e888d2..09d1d1c315d 100644 --- a/grails-gsp/core/src/main/groovy/org/grails/gsp/compiler/tags/GrailsTagRegistry.java +++ b/grails-gsp/core/src/main/groovy/org/grails/gsp/compiler/tags/GrailsTagRegistry.java @@ -18,6 +18,7 @@ */ package org.grails.gsp.compiler.tags; +import java.lang.reflect.InvocationTargetException; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -78,9 +79,9 @@ public GrailsTag newTag(String tagName) { Class tagClass = tagRegistry.get(tagName); try { - return (GrailsTag) tagClass.newInstance(); + return (GrailsTag) tagClass.getDeclaredConstructor().newInstance(); } - catch (InstantiationException e) { + catch (InstantiationException | InvocationTargetException | NoSuchMethodException e) { throw new GrailsTagException("Instantiation error loading tag [" + tagName + "]: " + e.getMessage(), e); } catch (IllegalAccessException e) { diff --git a/grails-gsp/grails-sitemesh3/src/main/java/org/grails/plugins/sitemesh3/Sitemesh3EnvironmentPostProcessor.java b/grails-gsp/grails-sitemesh3/src/main/java/org/grails/plugins/sitemesh3/Sitemesh3EnvironmentPostProcessor.java index b43dfa88dcb..becc35034f0 100644 --- a/grails-gsp/grails-sitemesh3/src/main/java/org/grails/plugins/sitemesh3/Sitemesh3EnvironmentPostProcessor.java +++ b/grails-gsp/grails-sitemesh3/src/main/java/org/grails/plugins/sitemesh3/Sitemesh3EnvironmentPostProcessor.java @@ -21,8 +21,8 @@ import java.util.HashMap; import java.util.Map; +import org.springframework.boot.EnvironmentPostProcessor; import org.springframework.boot.SpringApplication; -import org.springframework.boot.env.EnvironmentPostProcessor; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.MapPropertySource; diff --git a/grails-gsp/grails-web-jsp/src/main/groovy/org/grails/gsp/jsp/GroovyPagesJspApplicationContext.java b/grails-gsp/grails-web-jsp/src/main/groovy/org/grails/gsp/jsp/GroovyPagesJspApplicationContext.java index a97f93652ff..8c1476ff29a 100644 --- a/grails-gsp/grails-web-jsp/src/main/groovy/org/grails/gsp/jsp/GroovyPagesJspApplicationContext.java +++ b/grails-gsp/grails-web-jsp/src/main/groovy/org/grails/gsp/jsp/GroovyPagesJspApplicationContext.java @@ -88,7 +88,7 @@ private static ExpressionFactory tryExpressionFactoryImplementation(String packa if (ExpressionFactory.class.isAssignableFrom(cl)) { LOG.info("Using " + className + " as implementation of " + ExpressionFactory.class.getName()); - return (ExpressionFactory) cl.newInstance(); + return (ExpressionFactory) cl.getDeclaredConstructor().newInstance(); } LOG.warn("Class " + className + " does not implement " + ExpressionFactory.class.getName()); diff --git a/grails-gsp/spring-boot/src/main/java/grails/gsp/boot/GspAutoConfiguration.java b/grails-gsp/spring-boot/src/main/java/grails/gsp/boot/GspAutoConfiguration.java index 79ec59002fe..d32d50f72c3 100644 --- a/grails-gsp/spring-boot/src/main/java/grails/gsp/boot/GspAutoConfiguration.java +++ b/grails-gsp/spring-boot/src/main/java/grails/gsp/boot/GspAutoConfiguration.java @@ -157,7 +157,7 @@ protected List resolveTemplateRoots() { if (rootPath.endsWith("/")) { rootPath = rootPath.substring(0, rootPath.length() - 1); } - if (!StringUtils.isEmpty(rootPath)) { + if (StringUtils.hasLength(rootPath)) { rootPaths.add(rootPath); } } diff --git a/grails-shell-cli/src/main/groovy/org/grails/cli/command/run/SpringApplicationRunner.java b/grails-shell-cli/src/main/groovy/org/grails/cli/command/run/SpringApplicationRunner.java index 3c66cc65f4a..4c4265eda1f 100644 --- a/grails-shell-cli/src/main/groovy/org/grails/cli/command/run/SpringApplicationRunner.java +++ b/grails-shell-cli/src/main/groovy/org/grails/cli/command/run/SpringApplicationRunner.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.lang.reflect.Method; import java.net.MalformedURLException; +import java.net.URI; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; @@ -230,7 +231,7 @@ private List getSourceFiles() { List paths = ResourceUtils.getUrls(source, SpringApplicationRunner.this.compiler.getLoader()); for (String path : paths) { try { - URL url = new URL(path); + URL url = URI.create(path).toURL(); if ("file".equals(url.getProtocol())) { sources.add(new File(url.getFile())); } diff --git a/grails-shell-cli/src/main/groovy/org/grails/cli/compiler/GroovyCompiler.java b/grails-shell-cli/src/main/groovy/org/grails/cli/compiler/GroovyCompiler.java index 3051b9c8de5..5f777398cdf 100644 --- a/grails-shell-cli/src/main/groovy/org/grails/cli/compiler/GroovyCompiler.java +++ b/grails-shell-cli/src/main/groovy/org/grails/cli/compiler/GroovyCompiler.java @@ -20,6 +20,7 @@ import java.io.IOException; import java.lang.reflect.Field; +import java.net.URI; import java.net.URL; import java.util.ArrayList; import java.util.Collections; @@ -190,7 +191,7 @@ public Class[] compile(String... sources) throws CompilationFailedException, for (String source : sources) { List paths = ResourceUtils.getUrls(source, this.loader); for (String path : paths) { - compilationUnit.addSource(new URL(path)); + compilationUnit.addSource(URI.create(path).toURL()); } } diff --git a/grails-shell-cli/src/main/groovy/org/grails/cli/util/ResourceUtils.java b/grails-shell-cli/src/main/groovy/org/grails/cli/util/ResourceUtils.java index 2e23ed48ced..fb20df78f3a 100644 --- a/grails-shell-cli/src/main/groovy/org/grails/cli/util/ResourceUtils.java +++ b/grails-shell-cli/src/main/groovy/org/grails/cli/util/ResourceUtils.java @@ -20,6 +20,7 @@ import java.io.IOException; import java.net.MalformedURLException; +import java.net.URI; import java.net.URL; import java.util.ArrayList; import java.util.LinkedHashSet; @@ -159,7 +160,7 @@ public Resource getResource(String location) { } try { // Try to parse the location as a URL... - URL url = new URL(location); + URL url = URI.create(location).toURL(); return new UrlResource(url); } catch (MalformedURLException ex) { diff --git a/grails-test-suite-base/src/main/groovy/org/grails/support/MockApplicationContext.java b/grails-test-suite-base/src/main/groovy/org/grails/support/MockApplicationContext.java index 2e0efbad089..d0e7ce29dff 100644 --- a/grails-test-suite-base/src/main/groovy/org/grails/support/MockApplicationContext.java +++ b/grails-test-suite-base/src/main/groovy/org/grails/support/MockApplicationContext.java @@ -36,6 +36,8 @@ import jakarta.servlet.ServletContext; +import org.jspecify.annotations.NonNull; + import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanCreationException; import org.springframework.beans.factory.BeanFactory; @@ -53,7 +55,6 @@ import org.springframework.core.io.AbstractResource; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.lang.NonNull; import org.springframework.mock.web.MockServletContext; import org.springframework.util.AntPathMatcher; import org.springframework.util.PathMatcher; diff --git a/grails-web-common/src/main/groovy/org/grails/web/json/JSONObject.java b/grails-web-common/src/main/groovy/org/grails/web/json/JSONObject.java index dbbce9cc51d..f305bd048be 100644 --- a/grails-web-common/src/main/groovy/org/grails/web/json/JSONObject.java +++ b/grails-web-common/src/main/groovy/org/grails/web/json/JSONObject.java @@ -83,7 +83,7 @@ public class JSONObject implements JSONElement, Map { static { try { - javascriptEncoder = (StreamingEncoder) ClassUtils.forName("grails.encoders.JSONEncoder", JSONObject.class.getClassLoader()).newInstance(); + javascriptEncoder = (StreamingEncoder) ClassUtils.forName("grails.encoders.JSONEncoder", JSONObject.class.getClassLoader()).getDeclaredConstructor().newInstance(); javascriptEncoderStateless = (EncodesToWriter) javascriptEncoder; useStreamingJavascriptEncoder = true; } diff --git a/grails-web-common/src/main/groovy/org/grails/web/servlet/mvc/GrailsWebRequest.java b/grails-web-common/src/main/groovy/org/grails/web/servlet/mvc/GrailsWebRequest.java index 6eedcdec454..27421eb267e 100644 --- a/grails-web-common/src/main/groovy/org/grails/web/servlet/mvc/GrailsWebRequest.java +++ b/grails-web-common/src/main/groovy/org/grails/web/servlet/mvc/GrailsWebRequest.java @@ -29,10 +29,11 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import org.jspecify.annotations.Nullable; + import org.springframework.beans.PropertyEditorRegistry; import org.springframework.beans.PropertyEditorRegistrySupport; import org.springframework.context.ApplicationContext; -import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils; import org.springframework.web.context.request.RequestAttributes; diff --git a/grails-web-databinding/src/main/groovy/grails/web/databinding/DataBindingUtils.java b/grails-web-databinding/src/main/groovy/grails/web/databinding/DataBindingUtils.java index 55d23ed67f3..3b061f42680 100644 --- a/grails-web-databinding/src/main/groovy/grails/web/databinding/DataBindingUtils.java +++ b/grails-web-databinding/src/main/groovy/grails/web/databinding/DataBindingUtils.java @@ -19,6 +19,7 @@ package grails.web.databinding; import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Modifier; import java.util.Collection; import java.util.Collections; @@ -179,7 +180,16 @@ public static void bindToCollection(final Class targetType, final Collect } final List dataBindingSources = collectionBindingSource.getDataBindingSources(); for (final DataBindingSource dataBindingSource : dataBindingSources) { - final T newObject = targetType.newInstance(); + final T newObject; + try { + newObject = targetType.getDeclaredConstructor().newInstance(); + } catch(NoSuchMethodException | InvocationTargetException ex) { + throw new IllegalStateException( + "Could not instantiate class [" + targetType.getName() + "]", + ex + ); + } + bindObjectToDomainInstance(entity, newObject, dataBindingSource, getBindingIncludeList(newObject), Collections.emptyList(), null); collectionToPopulate.add(newObject); } diff --git a/grails-web-url-mappings/src/main/groovy/org/grails/web/mapping/RegexUrlMapping.java b/grails-web-url-mappings/src/main/groovy/org/grails/web/mapping/RegexUrlMapping.java index 5069852412e..8aa4143d786 100644 --- a/grails-web-url-mappings/src/main/groovy/org/grails/web/mapping/RegexUrlMapping.java +++ b/grails-web-url-mappings/src/main/groovy/org/grails/web/mapping/RegexUrlMapping.java @@ -656,7 +656,7 @@ private UrlMappingInfo createUrlMappingInfo(String uri, Matcher m) { } } // if the format is specified but the value is empty, ignore it - if (!(FORMAT_PARAMETER.equals(propertyName) && GrailsStringUtils.isEmpty(lastGroup))) { + if (!(FORMAT_PARAMETER.equals(propertyName) && !GrailsStringUtils.hasLength(lastGroup))) { params.put(propertyName, lastGroup); } break; @@ -680,7 +680,7 @@ private UrlMappingInfo createUrlMappingInfo(String uri, Matcher m) { lastGroup = lastGroup.substring(1); } // if the format is specified but the value is empty, ignore it - if (!(FORMAT_PARAMETER.equals(propertyName) && GrailsStringUtils.isEmpty(lastGroup))) { + if (!(FORMAT_PARAMETER.equals(propertyName) && !GrailsStringUtils.hasLength(lastGroup))) { params.put(propertyName, lastGroup); } } diff --git a/grails-wrapper/src/main/java/grails/init/GrailsUpdater.java b/grails-wrapper/src/main/java/grails/init/GrailsUpdater.java index d1c7e84c0b2..073901a04ff 100644 --- a/grails-wrapper/src/main/java/grails/init/GrailsUpdater.java +++ b/grails-wrapper/src/main/java/grails/init/GrailsUpdater.java @@ -21,6 +21,8 @@ import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; +import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; @@ -328,7 +330,12 @@ private String fetchSnapshotForVersion(GrailsWrapperRepo repo, GrailsVersion bas } private static HttpURLConnection createHttpURLConnection(String mavenMetadataFileUrl) throws IOException { - final URL url = new URL(mavenMetadataFileUrl); + final URL url; + try { + url = new URI(mavenMetadataFileUrl).toURL(); + } catch (URISyntaxException | IllegalArgumentException e) { + throw new IOException("Invalid Maven metadata URL: " + mavenMetadataFileUrl, e); + } HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestProperty("User-Agent", "Apache-Maven/3.9.6"); conn.setInstanceFollowRedirects(true); From bbea23c49fd35e8b1c34a1967795850087c55dd9 Mon Sep 17 00:00:00 2001 From: Mattias Reichel Date: Tue, 9 Jun 2026 08:23:53 +0200 Subject: [PATCH 2/4] fix: throw better exceptions on instantiation failures --- .../src/main/groovy/grails/util/GrailsClassUtils.java | 4 +++- .../main/groovy/grails/web/databinding/DataBindingUtils.java | 5 ++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/grails-core/src/main/groovy/grails/util/GrailsClassUtils.java b/grails-core/src/main/groovy/grails/util/GrailsClassUtils.java index 600d10886f4..c51a20d2a07 100644 --- a/grails-core/src/main/groovy/grails/util/GrailsClassUtils.java +++ b/grails-core/src/main/groovy/grails/util/GrailsClassUtils.java @@ -956,7 +956,9 @@ public static Object instantiateFromFlatConfig(Map flatConfig, S try { return ClassUtils.forName(className, ClassUtils.getDefaultClassLoader()).getDeclaredConstructor().newInstance(); } catch (InvocationTargetException | NoSuchMethodException e) { - throw new InstantiationException(); + throw new InstantiationException( + "Could not instantiate class [" + className + "]: " + e.getMessage() + ); } } diff --git a/grails-web-databinding/src/main/groovy/grails/web/databinding/DataBindingUtils.java b/grails-web-databinding/src/main/groovy/grails/web/databinding/DataBindingUtils.java index 3b061f42680..10c58862f07 100644 --- a/grails-web-databinding/src/main/groovy/grails/web/databinding/DataBindingUtils.java +++ b/grails-web-databinding/src/main/groovy/grails/web/databinding/DataBindingUtils.java @@ -184,9 +184,8 @@ public static void bindToCollection(final Class targetType, final Collect try { newObject = targetType.getDeclaredConstructor().newInstance(); } catch(NoSuchMethodException | InvocationTargetException ex) { - throw new IllegalStateException( - "Could not instantiate class [" + targetType.getName() + "]", - ex + throw new InstantiationException( + "Could not instantiate class [" + targetType.getName() + "]: " + ex.getMessage() ); } From 56b466401c627cee426a243290ee50df33cd429f Mon Sep 17 00:00:00 2001 From: Mattias Reichel Date: Tue, 9 Jun 2026 08:25:06 +0200 Subject: [PATCH 3/4] test(refactor): replace deprecated newInstance() --- .../web/pages/GroovyPagesUriSupportTests.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/grails-web-common/src/test/groovy/org/grails/web/pages/GroovyPagesUriSupportTests.java b/grails-web-common/src/test/groovy/org/grails/web/pages/GroovyPagesUriSupportTests.java index 0c589aa9fdd..a2706ed6f55 100644 --- a/grails-web-common/src/test/groovy/org/grails/web/pages/GroovyPagesUriSupportTests.java +++ b/grails-web-common/src/test/groovy/org/grails/web/pages/GroovyPagesUriSupportTests.java @@ -18,6 +18,8 @@ */ package org.grails.web.pages; +import java.lang.reflect.InvocationTargetException; + import groovy.lang.GroovyClassLoader; import groovy.lang.GroovyObject; import groovy.lang.GroovyObjectSupport; @@ -65,8 +67,8 @@ public void testGetTemplateURI() { } @Test - public void testGetTemplateURIForController() throws IllegalAccessException, InstantiationException { - GroovyObject controller = (GroovyObject) new GroovyClassLoader().parseClass("class FooController { }").newInstance(); + public void testGetTemplateURIForController() throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { + GroovyObject controller = (GroovyObject) new GroovyClassLoader().parseClass("class FooController { }").getDeclaredConstructor().newInstance(); GroovyPagesUriSupport uriSupport = new GroovyPagesUriSupport(); assertEquals("/foo/_bar.gsp", uriSupport.getTemplateURI(controller, "bar")); assertEquals("/bar/_foo.gsp", uriSupport.getTemplateURI(controller, "/bar/foo")); @@ -74,8 +76,8 @@ public void testGetTemplateURIForController() throws IllegalAccessException, Ins } @Test - public void testGetViewURIForController() throws IllegalAccessException, InstantiationException { - GroovyObject controller = (GroovyObject) new GroovyClassLoader().parseClass("class FooController { }").newInstance(); + public void testGetViewURIForController() throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { + GroovyObject controller = (GroovyObject) new GroovyClassLoader().parseClass("class FooController { }").getDeclaredConstructor().newInstance(); GroovyPagesUriSupport uriSupport = new GroovyPagesUriSupport(); assertEquals("/foo/bar.gsp", uriSupport.getViewURI(controller, "bar")); assertEquals("/bar.gsp", uriSupport.getViewURI(controller, "../bar")); @@ -84,8 +86,8 @@ public void testGetViewURIForController() throws IllegalAccessException, Instant } @Test - public void testNoSuffixGetViewURIForController() throws IllegalAccessException, InstantiationException { - GroovyObject controller = (GroovyObject) new GroovyClassLoader().parseClass("class FooController { }").newInstance(); + public void testNoSuffixGetViewURIForController() throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { + GroovyObject controller = (GroovyObject) new GroovyClassLoader().parseClass("class FooController { }").getDeclaredConstructor().newInstance(); GroovyPagesUriSupport uriSupport = new GroovyPagesUriSupport(); assertEquals("/foo/bar", uriSupport.getNoSuffixViewURI(controller, "bar")); assertEquals("/bar/foo", uriSupport.getNoSuffixViewURI(controller, "/bar/foo")); From e6c93cff45496eb57b998e07a0a8425035ed255b Mon Sep 17 00:00:00 2001 From: Mattias Reichel Date: Tue, 9 Jun 2026 08:26:00 +0200 Subject: [PATCH 4/4] style: formatting cleanup --- .../transform/internal/DelegateAsyncTransformation.java | 6 +++--- .../org/grails/orm/hibernate/cfg/GrailsDomainBinder.java | 2 +- .../orm/hibernate/support/hibernate7/SessionHolder.java | 2 +- .../gorm/validation/constraints/AbstractConstraint.java | 1 - .../gorm/async/transform/DelegateAsyncTransformation.java | 1 - .../groovy/grails/web/databinding/DataBindingUtils.java | 2 +- 6 files changed, 6 insertions(+), 8 deletions(-) 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 7ba30826f69..23a8453fdfe 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 @@ -176,9 +176,9 @@ private static ClassNode alignReturnType(final ClassNode receiver, final ClassNo } var genericsSpec = GenericsUtils.createGenericsSpec(receiver); var correctedReturnType = GenericsUtils.correctToGenericsSpecRecurse(genericsSpec, originalReturnType); - return correctedReturnType == null - ? originalReturnType.getPlainNodeReference() - : correctedReturnType; + return correctedReturnType == null ? + originalReturnType.getPlainNodeReference() : + correctedReturnType; } protected DelegateAsyncTransactionalMethodTransformer lookupAsyncTransactionalMethodTransformer() { 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 10b22c79424..12507402081 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 @@ -257,7 +257,7 @@ else if (strategy instanceof CharSequence) { else { try { namingStrategy = (NamingStrategy) namingStrategyClass.getDeclaredConstructor().newInstance(); - } catch(NoSuchMethodException | InvocationTargetException e) { + } catch (NoSuchMethodException | InvocationTargetException e) { throw new InstantiationException("Failed to instantiate naming strategy [" + strategy + "]: " + e.getMessage()); } } diff --git a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/SessionHolder.java b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/SessionHolder.java index df1bb454b49..7a039193708 100644 --- a/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/SessionHolder.java +++ b/grails-data-hibernate7/spring-orm/src/main/java/org/grails/orm/hibernate/support/hibernate7/SessionHolder.java @@ -19,8 +19,8 @@ import org.hibernate.FlushMode; import org.hibernate.Session; import org.hibernate.Transaction; - import org.jspecify.annotations.Nullable; + import org.springframework.orm.jpa.EntityManagerHolder; /** 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 85dc3157f82..a6947ca9a73 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 @@ -31,7 +31,6 @@ import org.springframework.core.style.ToStringCreator; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; -import org.springframework.util.StringUtils; import org.springframework.validation.BindingResult; import org.springframework.validation.Errors; import org.springframework.validation.FieldError; 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 f7042f25e23..7eea0c0bc71 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 @@ -49,7 +49,6 @@ 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; import org.codehaus.groovy.control.CompilePhase; import org.codehaus.groovy.control.SourceUnit; import org.codehaus.groovy.transform.ASTTransformation; diff --git a/grails-web-databinding/src/main/groovy/grails/web/databinding/DataBindingUtils.java b/grails-web-databinding/src/main/groovy/grails/web/databinding/DataBindingUtils.java index 10c58862f07..422a3bf99c3 100644 --- a/grails-web-databinding/src/main/groovy/grails/web/databinding/DataBindingUtils.java +++ b/grails-web-databinding/src/main/groovy/grails/web/databinding/DataBindingUtils.java @@ -183,7 +183,7 @@ public static void bindToCollection(final Class targetType, final Collect final T newObject; try { newObject = targetType.getDeclaredConstructor().newInstance(); - } catch(NoSuchMethodException | InvocationTargetException ex) { + } catch (NoSuchMethodException | InvocationTargetException ex) { throw new InstantiationException( "Could not instantiate class [" + targetType.getName() + "]: " + ex.getMessage() );