From 72ff45d11edc96c7eadee188c6da858be8731cb8 Mon Sep 17 00:00:00 2001 From: James Netherton Date: Tue, 5 Dec 2023 13:47:39 +0000 Subject: [PATCH] Fix Spring 6.1.x native support --- .../deployment/SpringKotlinProcessor.java | 5 +++ .../graal/SpringKotlinSubstitutions.java | 42 +++++++++++++++++++ extensions-support/spring/shade/beans/pom.xml | 1 - integration-tests/jta/pom.xml | 5 +-- integration-tests/spring-rabbitmq/pom.xml | 5 +-- integration-tests/sql/pom.xml | 5 +-- 6 files changed, 53 insertions(+), 10 deletions(-) diff --git a/extensions-support/spring/deployment/src/main/java/org/apache/camel/quarkus/support/spring/deployment/SpringKotlinProcessor.java b/extensions-support/spring/deployment/src/main/java/org/apache/camel/quarkus/support/spring/deployment/SpringKotlinProcessor.java index 6ed096e2880c..10f1f5a52dcb 100644 --- a/extensions-support/spring/deployment/src/main/java/org/apache/camel/quarkus/support/spring/deployment/SpringKotlinProcessor.java +++ b/extensions-support/spring/deployment/src/main/java/org/apache/camel/quarkus/support/spring/deployment/SpringKotlinProcessor.java @@ -47,6 +47,11 @@ void generateKotlinReflectClasses( createClass(generatedClass, "kotlin.reflect.KParameter", Object.class.getName(), true); createClass(generatedClass, "kotlin.reflect.KCallable", Object.class.getName(), false); createClass(generatedClass, "kotlin.reflect.KFunction", "kotlin.reflect.KCallable", false); + createClass(generatedClass, "kotlin.reflect.KAnnotatedElement", Object.class.getName(), false); + createClass(generatedClass, "kotlin.reflect.KClass", "kotlin.reflect.KAnnotatedElement", false); + createClass(generatedClass, "kotlin.text.Regex", Object.class.getName(), false); + createClass(generatedClass, "kotlin.coroutines.CoroutineContext$Key", Object.class.getName(), false); + createClass(generatedClass, "kotlinx.coroutines.Job$Key", "kotlin.coroutines.CoroutineContext$Key", false); } private boolean isKotlinStdlibAvailable(ApplicationModel applicationModel) { diff --git a/extensions-support/spring/runtime/src/main/java/org/apache/camel/quarkus/support/spring/graal/SpringKotlinSubstitutions.java b/extensions-support/spring/runtime/src/main/java/org/apache/camel/quarkus/support/spring/graal/SpringKotlinSubstitutions.java index 51bed4412fb1..c72e4111c460 100644 --- a/extensions-support/spring/runtime/src/main/java/org/apache/camel/quarkus/support/spring/graal/SpringKotlinSubstitutions.java +++ b/extensions-support/spring/runtime/src/main/java/org/apache/camel/quarkus/support/spring/graal/SpringKotlinSubstitutions.java @@ -16,8 +16,11 @@ */ package org.apache.camel.quarkus.support.spring.graal; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Type; +import java.util.function.BooleanSupplier; import com.oracle.svm.core.annotate.Delete; import com.oracle.svm.core.annotate.Substitute; @@ -44,6 +47,11 @@ public static boolean isKotlinReflectPresent() { public static boolean isKotlinType(Class clazz) { return false; } + + @Substitute + public static boolean isSuspendingFunction(Method method) { + return false; + } } @TargetClass(className = "org.springframework.core.KotlinReflectionParameterNameDiscoverer") @@ -51,6 +59,20 @@ public static boolean isKotlinType(Class clazz) { final class SubstituteKotlinReflectionParameterNameDiscoverer { } +@TargetClass(className = "org.springframework.beans.BeanUtils$KotlinDelegate") +final class SubstituteBeanUtilsKotlinDelegate { + @Substitute + public static Constructor findPrimaryConstructor(Class clazz) { + throw new UnsupportedOperationException("Kotlin is not supported"); + } + + @Substitute + public static T instantiateClass(Constructor ctor, Object... args) + throws IllegalAccessException, InvocationTargetException, InstantiationException { + throw new UnsupportedOperationException("Kotlin is not supported"); + } +} + @TargetClass(className = "org.springframework.core.MethodParameter$KotlinDelegate") final class SubstituteMethodParameterKotlinDelegate { @Substitute @@ -68,3 +90,23 @@ private static Class getReturnType(Method method) { throw new UnsupportedOperationException("Kotlin is not supported"); } } + +@TargetClass(className = "org.springframework.aop.support.AopUtils$KotlinDelegate", onlyWith = SpringAopPresent.class) +final class SubstituteAopUtilsKotlinDelegate { + @Substitute + public static Object invokeSuspendingFunction(Method method, Object target, Object... args) { + throw new UnsupportedOperationException("Kotlin is not supported"); + } +} + +final class SpringAopPresent implements BooleanSupplier { + @Override + public boolean getAsBoolean() { + try { + Thread.currentThread().getContextClassLoader().loadClass("org.springframework.aop.support.AopUtils"); + return true; + } catch (ClassNotFoundException e) { + return false; + } + } +} diff --git a/extensions-support/spring/shade/beans/pom.xml b/extensions-support/spring/shade/beans/pom.xml index c774af7104c5..7f067ee6ed2e 100644 --- a/extensions-support/spring/shade/beans/pom.xml +++ b/extensions-support/spring/shade/beans/pom.xml @@ -70,7 +70,6 @@ org/springframework/beans/factory/groovy/** - org/springframework/beans/BeanUtils$Kotlin* diff --git a/integration-tests/jta/pom.xml b/integration-tests/jta/pom.xml index 5697734c98e3..017bb3d6a8f8 100644 --- a/integration-tests/jta/pom.xml +++ b/integration-tests/jta/pom.xml @@ -88,8 +88,7 @@ - - + virtualDependencies diff --git a/integration-tests/spring-rabbitmq/pom.xml b/integration-tests/spring-rabbitmq/pom.xml index 6ba4b1b4324d..764b7f464081 100644 --- a/integration-tests/spring-rabbitmq/pom.xml +++ b/integration-tests/spring-rabbitmq/pom.xml @@ -79,8 +79,7 @@ - - + virtualDependencies diff --git a/integration-tests/sql/pom.xml b/integration-tests/sql/pom.xml index 9587bedf78d2..01ec2d33ce85 100644 --- a/integration-tests/sql/pom.xml +++ b/integration-tests/sql/pom.xml @@ -105,8 +105,7 @@ - - + virtualDependencies