You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2019/12/08 17:27:07 UTC
[camel-quarkus] branch master updated: Re-introduce
RoutesBuilderBuildItem #526
This is an automated email from the ASF dual-hosted git repository.
lburgazzoli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
The following commit(s) were added to refs/heads/master by this push:
new 949d102 Re-introduce RoutesBuilderBuildItem #526
949d102 is described below
commit 949d10267d2e47f0dbc61550ff5203cdffdeaab8
Author: lburgazzoli <lb...@gmail.com>
AuthorDate: Sun Dec 8 12:32:45 2019 +0100
Re-introduce RoutesBuilderBuildItem #526
---
.../quarkus/core/deployment/BuildProcessor.java | 71 ++++++++--------------
.../core/deployment/NativeImageProcessor.java | 3 +-
.../quarkus/core/runtime/CamelRegistryTest.java | 20 +++++-
.../org/apache/camel/quarkus/core/CamelMain.java | 25 ++++----
.../camel/quarkus/core/CamelMainRecorder.java | 13 ++++
5 files changed, 72 insertions(+), 60 deletions(-)
diff --git a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/BuildProcessor.java b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/BuildProcessor.java
index 421ae89..fac317e 100644
--- a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/BuildProcessor.java
+++ b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/BuildProcessor.java
@@ -46,9 +46,6 @@ import io.quarkus.deployment.builditem.ShutdownContextBuildItem;
import io.quarkus.deployment.recording.RecorderContext;
import io.quarkus.runtime.RuntimeValue;
import org.apache.camel.CamelContext;
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.AdviceWithRouteBuilder;
-import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.converter.BaseTypeConverterRegistry;
import org.apache.camel.quarkus.core.CamelConfig;
import org.apache.camel.quarkus.core.CamelMain;
@@ -71,7 +68,13 @@ import org.slf4j.LoggerFactory;
class BuildProcessor {
private static final Logger LOGGER = LoggerFactory.getLogger(BuildProcessor.class);
- private static final DotName TYPE_CONVERTER_LOADER_TYPE = DotName.createSimple(TypeConverterLoader.class.getName());
+
+ private static final DotName ROUTES_BUILDER_TYPE = DotName.createSimple(
+ "org.apache.camel.RoutesBuilder");
+ private static final DotName ROUTE_BUILDER_TYPE = DotName.createSimple(
+ "org.apache.camel.builder.RouteBuilder");
+ private static final DotName ADVICE_WITH_ROUTE_BUILDER_TYPE = DotName.createSimple(
+ "org.apache.camel.builder.AdviceWithRouteBuilder");
/*
* Build steps related to camel core.
@@ -272,59 +275,28 @@ class BuildProcessor {
*/
public static class Main {
- @BuildStep
+ @BuildStep(onlyIf = { Flags.MainEnabled.class, Flags.RoutesDiscoveryEnabled.class })
public List<CamelRoutesBuilderClassBuildItem> discoverRoutesBuilderClassNames(
- CombinedIndexBuildItem combinedIndex) {
+ CombinedIndexBuildItem combinedIndex,
+ CamelConfig config) {
+
final IndexView index = combinedIndex.getIndex();
+
Set<ClassInfo> allKnownImplementors = new HashSet<>();
- allKnownImplementors.addAll(
- index.getAllKnownImplementors(DotName.createSimple(RoutesBuilder.class.getName())));
- allKnownImplementors.addAll(
- index.getAllKnownSubclasses(DotName.createSimple(RouteBuilder.class.getName())));
- allKnownImplementors.addAll(
- index.getAllKnownSubclasses(DotName.createSimple(AdviceWithRouteBuilder.class.getName())));
+ allKnownImplementors.addAll(index.getAllKnownImplementors(ROUTES_BUILDER_TYPE));
+ allKnownImplementors.addAll(index.getAllKnownSubclasses(ROUTE_BUILDER_TYPE));
+ allKnownImplementors.addAll(index.getAllKnownSubclasses(ADVICE_WITH_ROUTE_BUILDER_TYPE));
return allKnownImplementors
.stream()
// public and non-abstract
.filter(ci -> ((ci.flags() & (Modifier.ABSTRACT | Modifier.PUBLIC)) == Modifier.PUBLIC))
.map(ClassInfo::name)
- .map(CamelRoutesBuilderClassBuildItem::new)
- .collect(Collectors.toList());
- }
-
- /**
- * This method filter out {@link RoutesBuilder} discovered either by classpath scanning
- * through Jandex or by ArC.
- *
- * @param camelRoutesBuilderClasses list of {@link CamelRoutesBuilderClassBuildItem} holding {@link RoutesBuilder}
- * classes discovered by classpath scanning.
- * @param recorder the recorder.
- * @param containerBeans list of beans known to the ArC container.
- * @param recorderContext the recorder context.
- * @param config the built time camel configuration.
- * @return a curated list of {@link CamelBeanBuildItem} holding {@link RoutesBuilder}.
- */
- @Record(ExecutionTime.STATIC_INIT)
- @BuildStep(onlyIf = { Flags.MainEnabled.class, Flags.RoutesDiscoveryEnabled.class })
- public List<CamelBeanBuildItem> collectRoutes(
- List<CamelRoutesBuilderClassBuildItem> camelRoutesBuilderClasses,
- CamelMainRecorder recorder,
- ContainerBeansBuildItem containerBeans,
- RecorderContext recorderContext,
- CamelConfig config) {
-
- return camelRoutesBuilderClasses.stream()
- .map(CamelRoutesBuilderClassBuildItem::getDotName)
- .filter(dotName -> !containerBeans.getClasses().contains(dotName))
.filter(dotName -> CamelSupport.isPathIncluded(
dotName.toString('/'),
config.main.routesDiscovery.excludePatterns,
config.main.routesDiscovery.includePatterns))
- .map(dotName -> new CamelBeanBuildItem(
- dotName.withoutPackagePrefix(),
- dotName.toString(),
- recorderContext.newInstance(dotName.toString())))
+ .map(CamelRoutesBuilderClassBuildItem::new)
.collect(Collectors.toList());
}
@@ -370,12 +342,15 @@ class BuildProcessor {
* This method should not attempt to start or initialize camel-main as this need to be done
* at runtime.
*/
+ @SuppressWarnings("unchecked")
@Record(ExecutionTime.STATIC_INIT)
@BuildStep(onlyIf = Flags.MainEnabled.class)
CamelMainBuildItem main(
+ ContainerBeansBuildItem containerBeans,
CamelMainRecorder recorder,
CamelContextBuildItem context,
CamelRoutesCollectorBuildItem routesCollector,
+ List<CamelRoutesBuilderClassBuildItem> routesBuilderClasses,
List<CamelMainListenerBuildItem> listeners,
BeanContainerBuildItem beanContainer) {
@@ -384,6 +359,14 @@ class BuildProcessor {
routesCollector.getValue(),
beanContainer.getValue());
+ for (CamelRoutesBuilderClassBuildItem item : routesBuilderClasses) {
+ // don't add routes builders that are known by the container
+ if (containerBeans.getClasses().contains(item.getDotName())) {
+ continue;
+ }
+
+ recorder.addRoutesBuilder(main, item.getDotName().toString());
+ }
for (CamelMainListenerBuildItem listener : listeners) {
recorder.addListener(main, listener.getListener());
}
diff --git a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/NativeImageProcessor.java b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/NativeImageProcessor.java
index 9d058f7..cbc1c55 100644
--- a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/NativeImageProcessor.java
+++ b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/NativeImageProcessor.java
@@ -17,7 +17,6 @@
package org.apache.camel.quarkus.core.deployment;
import java.io.InputStream;
-import java.lang.reflect.Modifier;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
@@ -185,7 +184,7 @@ class NativeImageProcessor {
// to bind beans to the registry
//
camelRoutesBuilders.forEach(dotName -> {
- reflectiveClass.produce(new ReflectiveClassBuildItem(true, false, dotName.toString()));
+ reflectiveClass.produce(new ReflectiveClassBuildItem(true, true, dotName.toString()));
});
reflectiveClass.produce(new ReflectiveClassBuildItem(
diff --git a/extensions/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelRegistryTest.java b/extensions/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelRegistryTest.java
index 15126c2..da1fe39 100644
--- a/extensions/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelRegistryTest.java
+++ b/extensions/core/deployment/src/test/java/org/apache/camel/quarkus/core/runtime/CamelRegistryTest.java
@@ -22,6 +22,7 @@ import javax.inject.Inject;
import javax.inject.Named;
import io.quarkus.test.QuarkusUnitTest;
+import org.apache.camel.BeanInject;
import org.apache.camel.BindToRegistry;
import org.apache.camel.Processor;
import org.apache.camel.RoutesBuilder;
@@ -38,7 +39,7 @@ public class CamelRegistryTest {
@RegisterExtension
static final QuarkusUnitTest CONFIG = new QuarkusUnitTest()
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
- .addClasses(BeanProducer.class, MyRoute.class));
+ .addClasses(BeanProducer.class, MyRoute.class, MyCDIRoute.class));
@Inject
Registry registry;
@@ -49,6 +50,13 @@ public class CamelRegistryTest {
}
@Test
+ public void testCamelDI() {
+ assertThat(registry.findByType(MyCDIRoute.class))
+ .isNotEmpty()
+ .first().hasFieldOrPropertyWithValue("bean1", "a");
+ }
+
+ @Test
public void testLookupByName() {
assertThat(registry.lookupByName("bean-1")).isInstanceOfSatisfying(String.class, s -> assertThat(s).isEqualTo("a"));
assertThat(registry.lookupByName("bean-2")).isInstanceOfSatisfying(String.class, s -> assertThat(s).isEqualTo("b"));
@@ -91,4 +99,14 @@ public class CamelRegistryTest {
};
}
}
+
+ @ApplicationScoped
+ public static class MyCDIRoute extends RouteBuilder {
+ @BeanInject("bean-1")
+ String bean1;
+
+ @Override
+ public void configure() throws Exception {
+ }
+ }
}
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMain.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMain.java
index 6a7a551..98691cf 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMain.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMain.java
@@ -47,25 +47,24 @@ public class CamelMain extends BaseMainSupport implements CamelContextAware {
}
postProcessCamelContext(getCamelContext());
+ getCamelContext().start();
+
+ for (MainListener listener : listeners) {
+ listener.afterStart(this);
+ }
+ }
+
+ @Override
+ protected void postProcessCamelContext(CamelContext camelContext) throws Exception {
+ super.postProcessCamelContext(camelContext);
- //
- // TODO: this is required as the bean post processor in camel main
- // is not triggered after all the routes are collected so i.e.
- // for those from the registry, Camel DI does not work.
- // This hack should be removed after the issues is fixed in
- // Camel, see https://issues.apache.org/jira/browse/CAMEL-14271
- //
+ // post process classes with camel's post processor so classes have supot
+ // for camel's simple di
CamelBeanPostProcessor postProcessor = camelContext.adapt(ExtendedCamelContext.class).getBeanPostProcessor();
for (RoutesBuilder builder : getRoutesBuilders()) {
postProcessor.postProcessBeforeInitialization(builder, builder.getClass().getName());
postProcessor.postProcessAfterInitialization(builder, builder.getClass().getName());
}
-
- getCamelContext().start();
-
- for (MainListener listener : listeners) {
- listener.afterStart(this);
- }
}
@Override
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainRecorder.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainRecorder.java
index 553b9c3..7d4c906 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainRecorder.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainRecorder.java
@@ -21,6 +21,7 @@ import io.quarkus.runtime.RuntimeValue;
import io.quarkus.runtime.ShutdownContext;
import io.quarkus.runtime.annotations.Recorder;
import org.apache.camel.CamelContext;
+import org.apache.camel.RoutesBuilder;
import org.apache.camel.impl.engine.DefaultReactiveExecutor;
import org.apache.camel.main.MainListener;
import org.apache.camel.main.RoutesCollector;
@@ -54,6 +55,18 @@ public class CamelMainRecorder {
return new RuntimeValue<>(main);
}
+ public void addRoutesBuilder(RuntimeValue<CamelMain> main, String routesBuilderClass) {
+ try {
+ CamelContext context = main.getValue().getCamelContext();
+ Class<RoutesBuilder> type = context.getClassResolver().resolveClass(routesBuilderClass, RoutesBuilder.class);
+ RoutesBuilder builder = context.getInjector().newInstance(type, false);
+
+ main.getValue().addRoutesBuilder(builder);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
public void addListener(RuntimeValue<CamelMain> main, RuntimeValue<MainListener> listener) {
main.getValue().addMainListener(listener.getValue());
}