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

davsclaus pushed a commit to branch lazy-exp
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 35b80d13f551f9673ccfc923a6bd873458fc9c70
Author: Claus Ibsen <[email protected]>
AuthorDate: Mon Sep 16 10:44:02 2024 +0200

    CAMEL-21138: camel-jbang - Export should use lazy bean. Only possible for 
factory method beans such as @Produces
---
 .../camel/dsl/jbang/core/commands/Export.java      |  1 +
 .../dsl/jbang/core/commands/ExportBaseCommand.java |  7 ++++-
 .../dsl/jbang/core/commands/ExportCamelMain.java   |  2 +-
 .../dsl/jbang/core/commands/ExportQuarkus.java     |  2 +-
 .../dsl/jbang/core/commands/ExportSpringBoot.java  |  2 +-
 .../apache/camel/dsl/jbang/core/commands/Run.java  |  9 ++++++
 .../java/org/apache/camel/main/KameletMain.java    |  4 ++-
 .../injection/AnnotationDependencyInjection.java   | 35 +++++++++++++++-------
 8 files changed, 46 insertions(+), 16 deletions(-)

diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java
index 70adc51d5df..b12f1515499 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java
@@ -147,6 +147,7 @@ public class Export extends ExportBaseCommand {
         cmd.packageName = this.packageName;
         cmd.excludes = this.excludes;
         cmd.ignoreLoadingError = this.ignoreLoadingError;
+        cmd.lazyBean = this.lazyBean;
         // run export
         return cmd.export();
     }
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
index c50b50ccf2d..1acc9dc7a2e 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java
@@ -218,6 +218,10 @@ public abstract class ExportBaseCommand extends 
CamelCommand {
                         description = "Whether to ignore route loading and 
compilation errors (use this with care!)")
     protected boolean ignoreLoadingError;
 
+    @CommandLine.Option(names = { "--lazy-bean" },
+            description = "Whether to use lazy bean initialization (can help 
with complex classloading issues")
+    protected boolean lazyBean;
+
     protected boolean symbolicLink;     // copy source files using symbolic 
link
 
     protected boolean javaLiveReload; // reload java codes in dev
@@ -296,7 +300,7 @@ public abstract class ExportBaseCommand extends 
CamelCommand {
         return null;
     }
 
-    protected Integer runSilently(boolean ignoreLoadingError) throws Exception 
{
+    protected Integer runSilently(boolean ignoreLoadingError, boolean 
lazyBean) throws Exception {
         Run run = new Run(getMain());
         // need to declare the profile to use for run
         run.dependencies = dependencies;
@@ -311,6 +315,7 @@ public abstract class ExportBaseCommand extends 
CamelCommand {
         run.kameletsVersion = kameletsVersion;
         run.localKameletDir = localKameletDir;
         run.ignoreLoadingError = ignoreLoadingError;
+        run.lazyBean = lazyBean;
         return run.runExport(ignoreLoadingError);
     }
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java
index d47a5b35c1f..709552d1e10 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportCamelMain.java
@@ -65,7 +65,7 @@ class ExportCamelMain extends Export {
             if (!quiet && fresh) {
                 printer().println("Generating fresh run data");
             }
-            int silent = runSilently(ignoreLoadingError);
+            int silent = runSilently(ignoreLoadingError, lazyBean);
             if (silent != 0) {
                 return silent;
             }
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java
index 4c2fa09585d..88914af1179 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportQuarkus.java
@@ -69,7 +69,7 @@ class ExportQuarkus extends Export {
             if (!quiet) {
                 printer().println("Generating fresh run data");
             }
-            int silent = runSilently(ignoreLoadingError);
+            int silent = runSilently(ignoreLoadingError, lazyBean);
             if (silent != 0) {
                 return silent;
             }
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportSpringBoot.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportSpringBoot.java
index 07cbe64ff9d..72979ac35b9 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportSpringBoot.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportSpringBoot.java
@@ -67,7 +67,7 @@ class ExportSpringBoot extends Export {
             if (!quiet) {
                 printer().println("Generating fresh run data");
             }
-            int silent = runSilently(ignoreLoadingError);
+            int silent = runSilently(ignoreLoadingError, lazyBean);
             if (silent != 0) {
                 return silent;
             }
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
index 02e49777bdd..8aa6b5c4d85 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
@@ -283,6 +283,10 @@ public class Run extends CamelCommand {
             description = "Whether to ignore route loading and compilation 
errors (use this with care!)")
     protected boolean ignoreLoadingError;
 
+    @Option(names = { "--lazy-bean" },
+            description = "Whether to use lazy bean initialization (can help 
with complex classloading issues")
+    protected boolean lazyBean;
+
     @Option(names = { "--prompt" },
             description = "Allow user to type in required parameters in prompt 
if not present in application")
     boolean prompt;
@@ -529,6 +533,9 @@ public class Run extends CamelCommand {
         if (ignoreLoadingError) {
             writeSetting(main, profileProperties, 
"camel.jbang.ignoreLoadingError", "true");
         }
+        if (lazyBean) {
+            writeSetting(main, profileProperties, "camel.jbang.lazyBean", 
"true");
+        }
         if (prompt) {
             writeSetting(main, profileProperties, "camel.jbang.prompt", 
"true");
         }
@@ -892,6 +899,7 @@ public class Run extends CamelCommand {
         eq.logging = false;
         eq.loggingLevel = "off";
         eq.ignoreLoadingError = this.ignoreLoadingError;
+        eq.lazyBean = this.lazyBean;
 
         // run export
         int exit = eq.export();
@@ -966,6 +974,7 @@ public class Run extends CamelCommand {
         eq.logging = false;
         eq.loggingLevel = "off";
         eq.ignoreLoadingError = this.ignoreLoadingError;
+        eq.lazyBean = this.lazyBean;
 
         // run export
         int exit = eq.export();
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
index f15786c1c65..75e5416ae1f 100644
--- 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
@@ -477,7 +477,9 @@ public class KameletMain extends MainCommandLineSupport {
         // load camel component and custom health-checks
         answer.setLoadHealthChecks(true);
         // annotation based dependency injection for camel/spring/quarkus 
annotations in DSLs and Java beans
-        
AnnotationDependencyInjection.initAnnotationBasedDependencyInjection(answer);
+
+        boolean lazyBean = 
"true".equals(getInitialProperties().get("camel.jbang.lazyBean"));
+        new AnnotationDependencyInjection(answer, lazyBean);
 
         if (!silent) {
             // silent should not include cli-connector
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/injection/AnnotationDependencyInjection.java
 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/injection/AnnotationDependencyInjection.java
index 0479ba6d14b..b50d08ee707 100644
--- 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/injection/AnnotationDependencyInjection.java
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/injection/AnnotationDependencyInjection.java
@@ -61,10 +61,11 @@ import org.springframework.stereotype.Service;
  */
 public final class AnnotationDependencyInjection {
 
-    private AnnotationDependencyInjection() {
-    }
+    private final boolean lazyBean;
+
+    public AnnotationDependencyInjection(CamelContext context, boolean 
lazyBean) {
+        this.lazyBean = lazyBean;
 
-    public static void initAnnotationBasedDependencyInjection(CamelContext 
context) {
         Registry registry = context.getRegistry();
         CamelBeanPostProcessor cbbp = 
PluginHelper.getBeanPostProcessor(context);
 
@@ -132,7 +133,7 @@ public final class AnnotationDependencyInjection {
         }
     }
 
-    private static class BindToRegistryCompilePostProcessor implements 
CompilePostProcessor {
+    private class BindToRegistryCompilePostProcessor implements 
CompilePostProcessor {
 
         @Override
         public void postCompile(CamelContext camelContext, String name, 
Class<?> clazz, byte[] byteCode, Object instance)
@@ -142,7 +143,7 @@ public final class AnnotationDependencyInjection {
             Configuration cfg = clazz.getAnnotation(Configuration.class);
 
             // special for lazy beans which we must create on-demand
-            if (instance == null && bir != null && bir.lazy()) {
+            if (instance == null && bir != null && (lazyBean || bir.lazy())) {
                 final String beanName = bir.value();
                 instance = (Supplier<Object>) () -> {
                     Object answer = 
camelContext.getInjector().newInstance(clazz);
@@ -189,7 +190,7 @@ public final class AnnotationDependencyInjection {
 
     }
 
-    private static class SpringAnnotationCompilePostProcessor implements 
CompilePostProcessor {
+    private class SpringAnnotationCompilePostProcessor implements 
CompilePostProcessor {
 
         @Override
         public void postCompile(CamelContext camelContext, String name, 
Class<?> clazz, byte[] byteCode, Object instance)
@@ -211,7 +212,7 @@ public final class AnnotationDependencyInjection {
         }
     }
 
-    private static class SpringBeanPostProcessorInjector implements 
CamelBeanPostProcessorInjector {
+    private class SpringBeanPostProcessorInjector implements 
CamelBeanPostProcessorInjector {
 
         private final CamelContext context;
         private final CamelPostProcessorHelper helper;
@@ -252,7 +253,13 @@ public final class AnnotationDependencyInjection {
         public void onMethodInject(Method method, Object bean, String 
beanName) {
             Bean bi = method.getAnnotation(Bean.class);
             if (bi != null) {
-                Object instance = helper.getInjectionBeanMethodValue(context, 
method, bean, beanName, "Bean");
+                Object instance;
+                if (lazyBean) {
+                    instance = (Supplier<Object>) () -> 
helper.getInjectionBeanMethodValue(context, method, bean, beanName,
+                            "Bean");
+                } else {
+                    instance = helper.getInjectionBeanMethodValue(context, 
method, bean, beanName, "Bean");
+                }
                 if (instance != null) {
                     String name = method.getName();
                     if (bi.name().length > 0) {
@@ -264,7 +271,7 @@ public final class AnnotationDependencyInjection {
         }
     }
 
-    private static class QuarkusAnnotationCompilePostProcessor implements 
CompilePostProcessor {
+    private class QuarkusAnnotationCompilePostProcessor implements 
CompilePostProcessor {
 
         @Override
         public void postCompile(CamelContext camelContext, String name, 
Class<?> clazz, byte[] byteCode, Object instance)
@@ -285,7 +292,7 @@ public final class AnnotationDependencyInjection {
         }
     }
 
-    private static class QuarkusBeanPostProcessorInjector implements 
CamelBeanPostProcessorInjector {
+    private class QuarkusBeanPostProcessorInjector implements 
CamelBeanPostProcessorInjector {
 
         private final CamelContext context;
         private final CamelPostProcessorHelper helper;
@@ -324,7 +331,13 @@ public final class AnnotationDependencyInjection {
             Produces produces = method.getAnnotation(Produces.class);
             Named bi = method.getAnnotation(Named.class);
             if (produces != null || bi != null) {
-                Object instance = helper.getInjectionBeanMethodValue(context, 
method, bean, beanName, "Produces");
+                Object instance;
+                if (lazyBean) {
+                    instance = (Supplier<Object>) () -> 
helper.getInjectionBeanMethodValue(context, method, bean, beanName,
+                            "Produces");
+                } else {
+                    instance = helper.getInjectionBeanMethodValue(context, 
method, bean, beanName, "Produces");
+                }
                 if (instance != null) {
                     String name = method.getName();
                     if (bi != null && !bi.value().isBlank()) {

Reply via email to