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/13 16:24:39 UTC

[camel-quarkus] branch master updated: Ensure RoutesBuilder instances created by a CDI Producder are not removed

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 7d3f384  Ensure RoutesBuilder instances created by a CDI Producder are  not removed
7d3f384 is described below

commit 7d3f3847e72161816916b80b197ae494b69b5551
Author: lburgazzoli <lb...@gmail.com>
AuthorDate: Fri Dec 13 11:58:44 2019 +0100

    Ensure RoutesBuilder instances created by a CDI Producder are  not removed
---
 .../quarkus/core/deployment/BuildProcessor.java    | 62 +++++++++++-----------
 .../quarkus/core/runtime/CamelRegistryTest.java    | 19 ++++++-
 .../camel/quarkus/core/CamelRouteProducer.java     | 39 ++++++++++++++
 .../org/apache/camel/quarkus/core/CamelTest.java   |  2 +-
 4 files changed, 89 insertions(+), 33 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 fac317e..a3933df 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
@@ -26,25 +26,6 @@ import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
 
-import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
-import io.quarkus.arc.deployment.BeanContainerBuildItem;
-import io.quarkus.arc.deployment.BeanRegistrationPhaseBuildItem;
-import io.quarkus.arc.deployment.UnremovableBeanBuildItem;
-import io.quarkus.arc.deployment.UnremovableBeanBuildItem.BeanClassNamesExclusion;
-import io.quarkus.arc.processor.BuildExtension;
-import io.quarkus.deployment.ApplicationArchive;
-import io.quarkus.deployment.Capabilities;
-import io.quarkus.deployment.annotations.BuildProducer;
-import io.quarkus.deployment.annotations.BuildStep;
-import io.quarkus.deployment.annotations.ExecutionTime;
-import io.quarkus.deployment.annotations.Overridable;
-import io.quarkus.deployment.annotations.Record;
-import io.quarkus.deployment.builditem.ApplicationArchivesBuildItem;
-import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
-import io.quarkus.deployment.builditem.ServiceStartBuildItem;
-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.impl.converter.BaseTypeConverterRegistry;
 import org.apache.camel.quarkus.core.CamelConfig;
@@ -66,6 +47,25 @@ import org.jboss.jandex.IndexView;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
+import io.quarkus.arc.deployment.BeanContainerBuildItem;
+import io.quarkus.arc.deployment.BeanRegistrationPhaseBuildItem;
+import io.quarkus.arc.deployment.UnremovableBeanBuildItem;
+import io.quarkus.arc.processor.BuildExtension;
+import io.quarkus.deployment.ApplicationArchive;
+import io.quarkus.deployment.Capabilities;
+import io.quarkus.deployment.annotations.BuildProducer;
+import io.quarkus.deployment.annotations.BuildStep;
+import io.quarkus.deployment.annotations.ExecutionTime;
+import io.quarkus.deployment.annotations.Overridable;
+import io.quarkus.deployment.annotations.Record;
+import io.quarkus.deployment.builditem.ApplicationArchivesBuildItem;
+import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
+import io.quarkus.deployment.builditem.ServiceStartBuildItem;
+import io.quarkus.deployment.builditem.ShutdownContextBuildItem;
+import io.quarkus.deployment.recording.RecorderContext;
+import io.quarkus.runtime.RuntimeValue;
+
 class BuildProcessor {
     private static final Logger LOGGER = LoggerFactory.getLogger(BuildProcessor.class);
 
@@ -81,8 +81,16 @@ class BuildProcessor {
      */
     public static class Core {
         @BuildStep
-        ContainerBeansBuildItem containerBeans(BeanRegistrationPhaseBuildItem beanRegistrationPhase) {
-            return new ContainerBeansBuildItem(beanRegistrationPhase.getContext().get(BuildExtension.Key.BEANS));
+        BeanRegistrationPhaseBuildItem.BeanConfiguratorBuildItem containerBeans(
+                BeanRegistrationPhaseBuildItem beanRegistrationPhase,
+                BuildProducer<ContainerBeansBuildItem> containerBeans) {
+
+            containerBeans.produce(
+                    new ContainerBeansBuildItem(beanRegistrationPhase.getContext().get(BuildExtension.Key.BEANS)));
+
+            // method using BeanRegistrationPhaseBuildItem should return a BeanConfiguratorBuildItem
+            // otherwise the build step may be processed at the wrong time.
+            return new BeanRegistrationPhaseBuildItem.BeanConfiguratorBuildItem();
         }
 
         @BuildStep
@@ -317,15 +325,9 @@ class BuildProcessor {
          * making the lazy beans unremovable in that case.
          */
         @BuildStep(onlyIf = Flags.MainEnabled.class)
-        UnremovableBeanBuildItem unremoveLazyBeans(
-                List<CamelRoutesBuilderClassBuildItem> camelRoutesClasses) {
-
-            final Set<String> lazyBeans = camelRoutesClasses.stream()
-                    .map(buildItem -> buildItem.getDotName().toString())
-                    .collect(Collectors.toSet());
-
-            return new UnremovableBeanBuildItem(new BeanClassNamesExclusion(lazyBeans));
-
+        UnremovableBeanBuildItem unremovableRoutesBuilders() {
+            return new UnremovableBeanBuildItem(
+                    b -> b.getTypes().stream().anyMatch(t -> t.name().equals(ROUTES_BUILDER_TYPE)));
         }
 
         @Overridable
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 da1fe39..69f6dde 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
@@ -39,14 +39,17 @@ public class CamelRegistryTest {
     @RegisterExtension
     static final QuarkusUnitTest CONFIG = new QuarkusUnitTest()
             .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
-                    .addClasses(BeanProducer.class, MyRoute.class, MyCDIRoute.class));
+                    .addClasses(BeanProducer.class, MyRoute.class, MyCDIRoute.class, MyCDIProducer.class));
 
     @Inject
     Registry registry;
 
     @Test
     public void testLookupRoutes() {
-        assertThat(registry.findByType(RoutesBuilder.class)).isNotEmpty();
+        // MyCDIRoute
+        // MyCDIProducer::routes
+        assertThat(registry.findByType(RoutesBuilder.class))
+                .hasSize(2);
     }
 
     @Test
@@ -109,4 +112,16 @@ public class CamelRegistryTest {
         public void configure() throws Exception {
         }
     }
+
+    @ApplicationScoped
+    public static class MyCDIProducer {
+        @Produces
+        public RoutesBuilder routes() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() throws Exception {
+                }
+            };
+        }
+    }
 }
diff --git a/integration-tests/core-main/src/main/java/org/apache/camel/quarkus/core/CamelRouteProducer.java b/integration-tests/core-main/src/main/java/org/apache/camel/quarkus/core/CamelRouteProducer.java
new file mode 100644
index 0000000..6a00a77
--- /dev/null
+++ b/integration-tests/core-main/src/main/java/org/apache/camel/quarkus/core/CamelRouteProducer.java
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ */
+package org.apache.camel.quarkus.core;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.inject.Produces;
+
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.builder.RouteBuilder;
+
+@ApplicationScoped
+public class CamelRouteProducer {
+
+    @Produces
+    RoutesBuilder producedRoute() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:produced")
+                        .id("produced")
+                        .to("log:produced");
+            }
+        };
+    }
+}
diff --git a/integration-tests/core-main/src/test/java/org/apache/camel/quarkus/core/CamelTest.java b/integration-tests/core-main/src/test/java/org/apache/camel/quarkus/core/CamelTest.java
index ae87660..4a79b0e 100644
--- a/integration-tests/core-main/src/test/java/org/apache/camel/quarkus/core/CamelTest.java
+++ b/integration-tests/core-main/src/test/java/org/apache/camel/quarkus/core/CamelTest.java
@@ -101,7 +101,7 @@ public class CamelTest {
                 .contains(CamelRoute.class.getName())
                 .doesNotContain(CamelRouteFiltered.class.getName());
         assertThat(p.getList("routes", String.class))
-                .contains("keep-alive", "configure", "beforeStart")
+                .contains("keep-alive", "configure", "beforeStart", "produced")
                 .doesNotContain("filtered");
 
         assertThat(p.getBoolean("autoConfigurationLogSummary")).isFalse();