Skip to content

Commit

Permalink
Ensure RoutesBuilder instancec created by a CDI Producder are not rem…
Browse files Browse the repository at this point in the history
…oved
  • Loading branch information
lburgazzoli committed Dec 13, 2019
1 parent b13e1fc commit e787343
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 33 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,25 +26,6 @@
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;
Expand All @@ -66,6 +47,25 @@
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);

Expand All @@ -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
Expand Down Expand Up @@ -317,15 +325,9 @@ void beans(BuildProducer<AdditionalBeanBuildItem> beanProducer) {
* 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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -109,4 +112,16 @@ public static class MyCDIRoute extends RouteBuilder {
public void configure() throws Exception {
}
}

@ApplicationScoped
public static class MyCDIProducer {
@Produces
public RoutesBuilder routes() {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
}
};
}
}
}
Original file line number Diff line number Diff line change
@@ -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");
}
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ public void testMainInstance() {
.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();
Expand Down

0 comments on commit e787343

Please sign in to comment.