You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2019/12/13 23:21:48 UTC

[camel-quarkus] branch master updated: Ensure custom services such as deataformats, languages and component are not removed from container

This is an automated email from the ASF dual-hosted git repository.

acosentino 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 c7b637f  Ensure custom services such as deataformats, languages and component are not removed from container
     new c40a0b6  Merge pull request #548 from lburgazzoli/unremovable-services
c7b637f is described below

commit c7b637f4f54754dd83d072b0eec52c86ff627a20
Author: lburgazzoli <lb...@gmail.com>
AuthorDate: Fri Dec 13 18:08:50 2019 +0100

    Ensure custom services such as deataformats, languages and component are not removed from container
---
 .../quarkus/core/deployment/BuildProcessor.java    | 58 +++++++++-----
 .../quarkus/core/deployment/CamelSupport.java      | 11 ++-
 .../quarkus/core/runtime/CamelRegistryTest.java    | 89 ++++++++++++++++++++--
 3 files changed, 131 insertions(+), 27 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 a3933df..dd825be 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,6 +26,24 @@ 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.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;
@@ -44,28 +62,10 @@ import org.apache.camel.spi.TypeConverterRegistry;
 import org.jboss.jandex.ClassInfo;
 import org.jboss.jandex.DotName;
 import org.jboss.jandex.IndexView;
+import org.jboss.jandex.Type;
 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);
 
@@ -75,6 +75,24 @@ class BuildProcessor {
             "org.apache.camel.builder.RouteBuilder");
     private static final DotName ADVICE_WITH_ROUTE_BUILDER_TYPE = DotName.createSimple(
             "org.apache.camel.builder.AdviceWithRouteBuilder");
+    private static final DotName DATA_FORMAT_TYPE = DotName.createSimple(
+            "org.apache.camel.spi.DataFormat");
+    private static final DotName LANGUAGE_TYPE = DotName.createSimple(
+            "org.apache.camel.spi.Language");
+    private static final DotName COMPONENT_TYPE = DotName.createSimple(
+            "org.apache.camel.Component");
+    private static final DotName PRODUCER_TYPE = DotName.createSimple(
+            "org.apache.camel.Producer");
+    private static final DotName PREDICATE_TYPE = DotName.createSimple(
+            "org.apache.camel.Predicate");
+
+    private static final Set<DotName> UNREMOVABLE_BEANS_TYPES = CamelSupport.setOf(
+            ROUTES_BUILDER_TYPE,
+            DATA_FORMAT_TYPE,
+            LANGUAGE_TYPE,
+            COMPONENT_TYPE,
+            PRODUCER_TYPE,
+            PREDICATE_TYPE);
 
     /*
      * Build steps related to camel core.
@@ -327,7 +345,7 @@ class BuildProcessor {
         @BuildStep(onlyIf = Flags.MainEnabled.class)
         UnremovableBeanBuildItem unremovableRoutesBuilders() {
             return new UnremovableBeanBuildItem(
-                    b -> b.getTypes().stream().anyMatch(t -> t.name().equals(ROUTES_BUILDER_TYPE)));
+                    b -> b.getTypes().stream().map(Type::name).anyMatch(UNREMOVABLE_BEANS_TYPES::contains));
         }
 
         @Overridable
diff --git a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelSupport.java b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelSupport.java
index 8cbe3c2..3c4847c 100644
--- a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelSupport.java
+++ b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelSupport.java
@@ -24,17 +24,20 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import java.util.Set;
+import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import io.quarkus.arc.processor.BeanInfo;
-import io.quarkus.deployment.builditem.ApplicationArchivesBuildItem;
 import org.apache.camel.util.AntPathMatcher;
 import org.apache.camel.util.ObjectHelper;
 import org.jboss.jandex.ClassInfo;
 
+import io.quarkus.deployment.builditem.ApplicationArchivesBuildItem;
+
 public final class CamelSupport {
     public static final String CAMEL_SERVICE_BASE_PATH = "META-INF/services/org/apache/camel";
     public static final String CAMEL_ROOT_PACKAGE_DIRECTORY = "org/apache/camel";
@@ -114,4 +117,8 @@ public final class CamelSupport {
         return answer;
     }
 
+    public static <T> Set<T> setOf(T... items) {
+        return Stream.of(items).collect(Collectors.toCollection(HashSet::new));
+    }
+
 }
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 69f6dde..e0de1a3 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
@@ -16,6 +16,9 @@
  */
 package org.apache.camel.quarkus.core.runtime;
 
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Map;
 import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.inject.Produces;
 import javax.inject.Inject;
@@ -24,10 +27,18 @@ import javax.inject.Named;
 import io.quarkus.test.QuarkusUnitTest;
 import org.apache.camel.BeanInject;
 import org.apache.camel.BindToRegistry;
+import org.apache.camel.Component;
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.Expression;
+import org.apache.camel.Predicate;
 import org.apache.camel.Processor;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.spi.DataFormat;
+import org.apache.camel.spi.Language;
 import org.apache.camel.spi.Registry;
+import org.apache.camel.support.DefaultComponent;
 import org.jboss.shrinkwrap.api.ShrinkWrap;
 import org.jboss.shrinkwrap.api.spec.JavaArchive;
 import org.junit.jupiter.api.Test;
@@ -39,17 +50,27 @@ public class CamelRegistryTest {
     @RegisterExtension
     static final QuarkusUnitTest CONFIG = new QuarkusUnitTest()
             .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
-                    .addClasses(BeanProducer.class, MyRoute.class, MyCDIRoute.class, MyCDIProducer.class));
+                    .addClasses(BeanProducer.class)
+                    .addClasses(MyRoute.class, MyCDIRoute.class, MyCDIProducer.class)
+                    .addClasses(MyLanguage.class, MyDataFormat.class, MyComponent.class));
 
     @Inject
     Registry registry;
 
     @Test
     public void testLookupRoutes() {
-        // MyCDIRoute
-        // MyCDIProducer::routes
-        assertThat(registry.findByType(RoutesBuilder.class))
-                .hasSize(2);
+        assertThat(registry.findByType(RoutesBuilder.class)).hasSize(2);
+        assertThat(registry.lookupByNameAndType("my-route", RoutesBuilder.class)).isNotNull();
+        assertThat(registry.lookupByNameAndType("my-route-produced", RoutesBuilder.class)).isNotNull();
+    }
+
+    @Test
+    public void testLookupCustomServices() {
+        assertThat(registry.lookupByNameAndType("my-df", DataFormat.class)).isNotNull();
+        assertThat(registry.lookupByNameAndType("my-language", Language.class)).isNotNull();
+        assertThat(registry.lookupByNameAndType("my-component", Component.class)).isNotNull();
+        assertThat(registry.lookupByNameAndType("my-predicate", Predicate.class)).isNotNull();
+        assertThat(registry.lookupByNameAndType("my-processor", Processor.class)).isNotNull();
     }
 
     @Test
@@ -103,6 +124,7 @@ public class CamelRegistryTest {
         }
     }
 
+    @Named("my-route")
     @ApplicationScoped
     public static class MyCDIRoute extends RouteBuilder {
         @BeanInject("bean-1")
@@ -115,6 +137,7 @@ public class CamelRegistryTest {
 
     @ApplicationScoped
     public static class MyCDIProducer {
+        @Named("my-route-produced")
         @Produces
         public RoutesBuilder routes() {
             return new RouteBuilder() {
@@ -123,5 +146,61 @@ public class CamelRegistryTest {
                 }
             };
         }
+
+        @Named("my-predicate")
+        @Produces
+        public Predicate predicate() {
+            return e -> false;
+        }
+
+        @Named("my-processor")
+        @Produces
+        public Processor processor() {
+            return e -> {};
+        }
+    }
+
+    @Named("my-df")
+    @ApplicationScoped
+    public static class MyDataFormat implements DataFormat {
+        @Override
+        public void marshal(Exchange exchange, Object graph, OutputStream stream) throws Exception {
+        }
+
+        @Override
+        public Object unmarshal(Exchange exchange, InputStream stream) throws Exception {
+            return null;
+        }
+
+        @Override
+        public void start() {
+        }
+
+        @Override
+        public void stop() {
+        }
+    }
+
+    @Named("my-language")
+    @ApplicationScoped
+    public static class MyLanguage implements Language {
+        @Override
+        public Predicate createPredicate(String expression) {
+            return null;
+        }
+
+        @Override
+        public Expression createExpression(String expression) {
+            return null;
+        }
+    }
+
+    @Named("my-component")
+    @ApplicationScoped
+    public static class MyComponent extends DefaultComponent {
+        @Override
+        protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+            return null;
+        }
     }
 }