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 <lburgazz...@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; + } } }