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


The following commit(s) were added to refs/heads/lazy-exp by this push:
     new a75276daabf CAMEL-21138: camel-jbang - Export should use lazy bean. 
Only possible for factory method beans such as @Produces
a75276daabf is described below

commit a75276daabfb4eccfbc602d626628fcafff8c0db
Author: Claus Ibsen <[email protected]>
AuthorDate: Mon Sep 16 12:41:34 2024 +0200

    CAMEL-21138: camel-jbang - Export should use lazy bean. Only possible for 
factory method beans such as @Produces
---
 .../camel/spring/xml/CamelBeanPostProcessor.java   | 15 +++++++++++
 .../camel/spring/spi/CamelBeanPostProcessor.java   | 13 ++++++++++
 .../apache/camel/spi/CamelBeanPostProcessor.java   | 12 +++++++++
 .../impl/engine/DefaultCamelBeanPostProcessor.java | 29 ++++++++++++++++++----
 .../dsl/jbang/core/commands/ExportBaseCommand.java |  2 +-
 .../camel/dsl/jbang/core/commands/ExportTest.java  | 19 +++++++++++++-
 .../src/test/resources/LazyFoo.java                | 27 ++++++++++++++++++++
 .../injection/AnnotationDependencyInjection.java   |  6 +++++
 8 files changed, 116 insertions(+), 7 deletions(-)

diff --git 
a/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/CamelBeanPostProcessor.java
 
b/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/CamelBeanPostProcessor.java
index af05b7ff10d..d8d298a5e47 100644
--- 
a/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/CamelBeanPostProcessor.java
+++ 
b/components/camel-spring-xml/src/main/java/org/apache/camel/spring/xml/CamelBeanPostProcessor.java
@@ -19,12 +19,14 @@ package org.apache.camel.spring.xml;
 import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Predicate;
 
 import jakarta.xml.bind.annotation.XmlAccessType;
 import jakarta.xml.bind.annotation.XmlAccessorType;
 import jakarta.xml.bind.annotation.XmlRootElement;
 import jakarta.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.BindToRegistry;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
 import org.apache.camel.Service;
@@ -65,6 +67,8 @@ public class CamelBeanPostProcessor
     private String camelId;
     @XmlTransient
     private boolean bindToRegistrySupported;
+    @XmlTransient
+    private Predicate<BindToRegistry> lazyBeanStrategy;
 
     // must use a delegate, as we cannot extend DefaultCamelBeanPostProcessor, 
as this will cause the
     // XSD schema generator to include the DefaultCamelBeanPostProcessor as a 
type, which we do not want to
@@ -234,4 +238,15 @@ public class CamelBeanPostProcessor
     public boolean isEnabled() {
         return delegate.isEnabled();
     }
+
+    @Override
+    public void setLazyBeanStrategy(Predicate<BindToRegistry> strategy) {
+        this.lazyBeanStrategy = strategy;
+    }
+
+    @Override
+    public Predicate<BindToRegistry> getLazyBeanStrategy() {
+        return lazyBeanStrategy;
+    }
+
 }
diff --git 
a/components/camel-spring/src/main/java/org/apache/camel/spring/spi/CamelBeanPostProcessor.java
 
b/components/camel-spring/src/main/java/org/apache/camel/spring/spi/CamelBeanPostProcessor.java
index 3c50c04e5e3..a616c10f304 100644
--- 
a/components/camel-spring/src/main/java/org/apache/camel/spring/spi/CamelBeanPostProcessor.java
+++ 
b/components/camel-spring/src/main/java/org/apache/camel/spring/spi/CamelBeanPostProcessor.java
@@ -19,7 +19,9 @@ package org.apache.camel.spring.spi;
 import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Predicate;
 
+import org.apache.camel.BindToRegistry;
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.Endpoint;
@@ -53,6 +55,7 @@ public class CamelBeanPostProcessor
     private ApplicationContext applicationContext;
     private String camelId;
     private boolean bindToRegistrySupported;
+    private Predicate<BindToRegistry> lazyBeanStrategy;
 
     // must use a delegate, as we cannot extend DefaultCamelBeanPostProcessor, 
as this will cause the
     // XSD schema generator to include the DefaultCamelBeanPostProcessor as a 
type, which we do not want to
@@ -238,4 +241,14 @@ public class CamelBeanPostProcessor
     public boolean isEnabled() {
         return delegate.isEnabled();
     }
+
+    @Override
+    public void setLazyBeanStrategy(Predicate<BindToRegistry> strategy) {
+        this.lazyBeanStrategy = strategy;
+    }
+
+    @Override
+    public Predicate<BindToRegistry> getLazyBeanStrategy() {
+        return lazyBeanStrategy;
+    }
 }
diff --git 
a/core/camel-api/src/main/java/org/apache/camel/spi/CamelBeanPostProcessor.java 
b/core/camel-api/src/main/java/org/apache/camel/spi/CamelBeanPostProcessor.java
index 1fff61155a4..ce38b989e30 100644
--- 
a/core/camel-api/src/main/java/org/apache/camel/spi/CamelBeanPostProcessor.java
+++ 
b/core/camel-api/src/main/java/org/apache/camel/spi/CamelBeanPostProcessor.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.spi;
 
+import org.apache.camel.BindToRegistry;
+
 /**
  * Bean post processor.
  */
@@ -92,4 +94,14 @@ public interface CamelBeanPostProcessor {
         // noop
     }
 
+    /**
+     * Custom strategy for handling {@link BindToRegistry} beans and whether 
they are lazy or not.
+     */
+    void setLazyBeanStrategy(java.util.function.Predicate<BindToRegistry> 
strategy);
+
+    /**
+     * Custom strategy for handling {@link BindToRegistry} beans and whether 
they are lazy or not.
+     */
+    java.util.function.Predicate<BindToRegistry> getLazyBeanStrategy();
+
 }
diff --git 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultCamelBeanPostProcessor.java
 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultCamelBeanPostProcessor.java
index 7fd5cdbf967..4f5b7052ba9 100644
--- 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultCamelBeanPostProcessor.java
+++ 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultCamelBeanPostProcessor.java
@@ -23,6 +23,7 @@ import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.List;
 import java.util.function.Function;
+import java.util.function.Predicate;
 import java.util.function.Supplier;
 
 import org.apache.camel.BeanConfigInject;
@@ -70,6 +71,7 @@ public class DefaultCamelBeanPostProcessor implements 
CamelBeanPostProcessor, Ca
     protected CamelContext camelContext;
     protected boolean enabled = true;
     protected boolean unbindEnabled;
+    protected java.util.function.Predicate<BindToRegistry> lazyBeanStrategy;
 
     public DefaultCamelBeanPostProcessor() {
     }
@@ -108,6 +110,16 @@ public class DefaultCamelBeanPostProcessor implements 
CamelBeanPostProcessor, Ca
         this.unbindEnabled = unbindEnabled;
     }
 
+    @Override
+    public Predicate<BindToRegistry> getLazyBeanStrategy() {
+        return lazyBeanStrategy;
+    }
+
+    @Override
+    public void setLazyBeanStrategy(Predicate<BindToRegistry> 
lazyBeanStrategy) {
+        this.lazyBeanStrategy = lazyBeanStrategy;
+    }
+
     @Override
     public void addCamelBeanPostProjectInjector(CamelBeanPostProcessorInjector 
injector) {
         this.beanPostProcessorInjectors.add(injector);
@@ -405,9 +417,9 @@ public class DefaultCamelBeanPostProcessor implements 
CamelBeanPostProcessor, Ca
 
         // bind each method
         methods.forEach(method -> {
-            BindToRegistry bind = method.getAnnotation(BindToRegistry.class);
-            bindToRegistry(method, bind.value(), bean, beanName, 
bind.beanPostProcess(), bind.lazy(), bind.initMethod(),
-                    bind.destroyMethod());
+            BindToRegistry ann = method.getAnnotation(BindToRegistry.class);
+            bindToRegistry(method, ann.value(), bean, beanName, 
ann.beanPostProcess(), isLazyBean(ann), ann.initMethod(),
+                    ann.destroyMethod());
         });
     }
 
@@ -415,7 +427,7 @@ public class DefaultCamelBeanPostProcessor implements 
CamelBeanPostProcessor, Ca
         Class<?> clazz = bean.getClass();
         BindToRegistry ann = clazz.getAnnotation(BindToRegistry.class);
         if (ann != null) {
-            bindToRegistry(clazz, ann.value(), bean, beanName, 
ann.beanPostProcess(), ann.lazy(), ann.initMethod(),
+            bindToRegistry(clazz, ann.value(), bean, beanName, 
ann.beanPostProcess(), isLazyBean(ann), ann.initMethod(),
                     ann.destroyMethod());
         }
     }
@@ -425,7 +437,7 @@ public class DefaultCamelBeanPostProcessor implements 
CamelBeanPostProcessor, Ca
             BindToRegistry ann = clazz.getAnnotation(BindToRegistry.class);
             if (ann != null) {
                 // it is a nested class so we don't have a bean instance for it
-                bindToRegistry(clazz, ann.value(), null, null, 
ann.beanPostProcess(), ann.lazy(), ann.initMethod(),
+                bindToRegistry(clazz, ann.value(), null, null, 
ann.beanPostProcess(), isLazyBean(ann), ann.initMethod(),
                         ann.destroyMethod());
             }
         });
@@ -459,6 +471,13 @@ public class DefaultCamelBeanPostProcessor implements 
CamelBeanPostProcessor, Ca
         }
     }
 
+    protected boolean isLazyBean(BindToRegistry ann) {
+        if (lazyBeanStrategy == null) {
+            return ann.lazy();
+        }
+        return lazyBeanStrategy.test(ann);
+    }
+
     public void setterInjection(Method method, Object bean, String beanName, 
String endpointUri, String endpointProperty) {
         Class<?>[] parameterTypes = method.getParameterTypes();
         if (parameterTypes.length != 1) {
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 1acc9dc7a2e..0025b60493a 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
@@ -219,7 +219,7 @@ public abstract class ExportBaseCommand extends 
CamelCommand {
     protected boolean ignoreLoadingError;
 
     @CommandLine.Option(names = { "--lazy-bean" },
-            description = "Whether to use lazy bean initialization (can help 
with complex classloading issues")
+                        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
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportTest.java
index 363451cce62..e0b5d672b7c 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportTest.java
@@ -62,7 +62,7 @@ class ExportTest {
 
     @ParameterizedTest
     @MethodSource("runtimeProvider")
-    public void shouldGenerateSpringBootProject(RuntimeType rt) throws 
Exception {
+    public void shouldGenerateProject(RuntimeType rt) throws Exception {
         Export command = createCommand(rt, new String[] { 
"classpath:route.yaml" },
                 "--gav=examples:route:1.0.0", "--dir=" + workingDir, 
"--quiet");
         int exit = command.doCall();
@@ -120,10 +120,27 @@ class ExportTest {
         Export command = new ExportSpringBoot(new CamelJBangMain());
         CommandLine.populateCommand(command, "--gav=examples:route:1.0.0", 
"--dir=" + workingDir, "--quiet",
                 "--runtime=%s".formatted(rt.runtime()));
+        if (args != null) {
+            CommandLine.populateCommand(command, args);
+        }
         command.files = Arrays.asList(files);
         return command;
     }
 
+    @ParameterizedTest
+    @MethodSource("runtimeProvider")
+    public void shouldExportLazyBean(RuntimeType rt) throws Exception {
+        Export command = createCommand(rt, new String[] { 
"classpath:route.yaml", "file:src/test/resources/LazyFoo.java" },
+                "--gav=examples:route:1.0.0", "--dir=" + workingDir, 
"--quiet", "--lazy-bean");
+        int exit = command.doCall();
+
+        Assertions.assertEquals(0, exit);
+        Model model = readMavenModel();
+        Assertions.assertEquals("examples", model.getGroupId());
+        Assertions.assertEquals("route", model.getArtifactId());
+        Assertions.assertEquals("1.0.0", model.getVersion());
+    }
+
     private Model readMavenModel() throws Exception {
         File f = workingDir.toPath().resolve("pom.xml").toFile();
         Assertions.assertTrue(f.isFile(), "Not a pom.xml file: " + f);
diff --git a/dsl/camel-jbang/camel-jbang-core/src/test/resources/LazyFoo.java 
b/dsl/camel-jbang/camel-jbang-core/src/test/resources/LazyFoo.java
new file mode 100755
index 00000000000..88db2860f48
--- /dev/null
+++ b/dsl/camel-jbang/camel-jbang-core/src/test/resources/LazyFoo.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+// use modeline to configure properties directly in the same source file
+// camel-k: language=java name=Cool property=period=1000
+import org.apache.camel.BindToRegistry;
+
+public class LazyFoo {
+
+  @BindToRegistry
+  public String myFoo() {
+      throw new IllegalArgumentException("Cannot load foo driver");
+  }
+}
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 b50d08ee707..f0976f1bbb4 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
@@ -68,6 +68,10 @@ public final class AnnotationDependencyInjection {
 
         Registry registry = context.getRegistry();
         CamelBeanPostProcessor cbbp = 
PluginHelper.getBeanPostProcessor(context);
+        if (lazyBean) {
+            // force lazy beans
+            cbbp.setLazyBeanStrategy((ann) -> true);
+        }
 
         // camel / common
         registry.bind("CamelTypeConverterCompilePostProcessor", new 
TypeConverterCompilePostProcessor());
@@ -79,6 +83,8 @@ public final class AnnotationDependencyInjection {
         // quarkus
         registry.bind("QuarkusAnnotationCompilePostProcessor", new 
QuarkusAnnotationCompilePostProcessor());
         cbbp.addCamelBeanPostProjectInjector(new 
QuarkusBeanPostProcessorInjector(context));
+
+
     }
 
     private static class TypeConverterCompilePostProcessor implements 
CompilePostProcessor {

Reply via email to