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 {