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());
     }