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 2020/03/12 13:20:29 UTC

[camel-quarkus] branch master updated: FastCamelContext to implement ModelCamelContext #877

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 f6fbc13  FastCamelContext to implement ModelCamelContext #877
f6fbc13 is described below

commit f6fbc13c927ff29fb5cb54eb4b9c5c8df368617d
Author: lburgazzoli <lb...@gmail.com>
AuthorDate: Thu Mar 12 10:55:37 2020 +0100

    FastCamelContext to implement ModelCamelContext #877
    
    ModelCamelContext is used in a number of spots by camel-main and others
    bit but so far camel-quarkus's FastCamelContext did not implement it
    which may cause NPE or CCE
---
 .../camel/quarkus/core/FastCamelContext.java       | 190 ++++++++++++++++++++-
 .../camel/quarkus/core/CoreMainResource.java       |   8 +
 .../src/main/resources/application.properties      |   2 +
 .../apache/camel/quarkus/core/CoreMainTest.java    |  10 ++
 .../apache/camel/quarkus/core/CoreResource.java    |  26 +++
 .../org/apache/camel/quarkus/core/CoreTest.java    |   6 +
 6 files changed, 234 insertions(+), 8 deletions(-)

diff --git a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastCamelContext.java b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastCamelContext.java
index da27c25..f0d0493 100644
--- a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastCamelContext.java
+++ b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastCamelContext.java
@@ -19,8 +19,10 @@ package org.apache.camel.quarkus.core;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Collection;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ExecutorService;
+import java.util.function.Function;
 
 import org.apache.camel.AsyncProcessor;
 import org.apache.camel.CatalogCamelContext;
@@ -66,7 +68,17 @@ import org.apache.camel.impl.engine.RestRegistryFactoryResolver;
 import org.apache.camel.impl.health.DefaultHealthCheckRegistry;
 import org.apache.camel.impl.transformer.TransformerKey;
 import org.apache.camel.impl.validator.ValidatorKey;
+import org.apache.camel.model.DataFormatDefinition;
+import org.apache.camel.model.HystrixConfigurationDefinition;
 import org.apache.camel.model.Model;
+import org.apache.camel.model.ModelCamelContext;
+import org.apache.camel.model.ProcessorDefinition;
+import org.apache.camel.model.Resilience4jConfigurationDefinition;
+import org.apache.camel.model.RouteDefinition;
+import org.apache.camel.model.cloud.ServiceCallConfigurationDefinition;
+import org.apache.camel.model.rest.RestDefinition;
+import org.apache.camel.model.transformer.TransformerDefinition;
+import org.apache.camel.model.validator.ValidatorDefinition;
 import org.apache.camel.processor.MulticastProcessor;
 import org.apache.camel.spi.AsyncProcessorAwaitManager;
 import org.apache.camel.spi.BeanIntrospection;
@@ -112,7 +124,7 @@ import org.apache.camel.spi.XMLRoutesDefinitionLoader;
 import org.apache.camel.support.CamelContextHelper;
 import org.apache.camel.util.IOHelper;
 
-public class FastCamelContext extends AbstractCamelContext implements CatalogCamelContext {
+public class FastCamelContext extends AbstractCamelContext implements CatalogCamelContext, ModelCamelContext {
     private final Model model;
     private final String version;
     private final XMLRoutesDefinitionLoader xmlLoader;
@@ -136,13 +148,6 @@ public class FastCamelContext extends AbstractCamelContext implements CatalogCam
     }
 
     @Override
-    protected void startRouteDefinitions() throws Exception {
-        if (model != null) {
-            model.startRouteDefinitions();
-        }
-    }
-
-    @Override
     public <T> T getExtension(Class<T> type) {
         if (type.isInstance(model)) {
             return type.cast(model);
@@ -500,4 +505,173 @@ public class FastCamelContext extends AbstractCamelContext implements CatalogCam
 
         return null;
     }
+
+    //
+    // ModelCamelContext
+    //
+
+    @Override
+    public void startRouteDefinitions() throws Exception {
+        model.startRouteDefinitions();
+    }
+
+    @Override
+    public List<RouteDefinition> getRouteDefinitions() {
+        return model.getRouteDefinitions();
+    }
+
+    @Override
+    public RouteDefinition getRouteDefinition(String id) {
+        return model.getRouteDefinition(id);
+    }
+
+    @Override
+    public void addRouteDefinitions(Collection<RouteDefinition> routeDefinitions) throws Exception {
+        model.addRouteDefinitions(routeDefinitions);
+    }
+
+    @Override
+    public void addRouteDefinition(RouteDefinition routeDefinition) throws Exception {
+        model.addRouteDefinition(routeDefinition);
+    }
+
+    @Override
+    public void removeRouteDefinitions(Collection<RouteDefinition> routeDefinitions) throws Exception {
+        model.removeRouteDefinitions(routeDefinitions);
+    }
+
+    @Override
+    public void removeRouteDefinition(RouteDefinition routeDefinition) throws Exception {
+        model.removeRouteDefinition(routeDefinition);
+    }
+
+    @Override
+    public List<RestDefinition> getRestDefinitions() {
+        return model.getRestDefinitions();
+    }
+
+    @Override
+    public void addRestDefinitions(Collection<RestDefinition> restDefinitions, boolean addToRoutes) throws Exception {
+        model.addRestDefinitions(restDefinitions, addToRoutes);
+    }
+
+    @Override
+    public void setDataFormats(Map<String, DataFormatDefinition> dataFormats) {
+        model.setDataFormats(dataFormats);
+    }
+
+    @Override
+    public Map<String, DataFormatDefinition> getDataFormats() {
+        return model.getDataFormats();
+    }
+
+    @Override
+    public DataFormatDefinition resolveDataFormatDefinition(String name) {
+        return model.resolveDataFormatDefinition(name);
+    }
+
+    @Override
+    public ProcessorDefinition getProcessorDefinition(String id) {
+        return model.getProcessorDefinition(id);
+    }
+
+    @Override
+    public <T extends ProcessorDefinition> T getProcessorDefinition(String id, Class<T> type) {
+        return model.getProcessorDefinition(id, type);
+    }
+
+    @Override
+    public void setValidators(List<ValidatorDefinition> validators) {
+        model.setValidators(validators);
+    }
+
+    @Override
+    public HystrixConfigurationDefinition getHystrixConfiguration(String id) {
+        return model.getHystrixConfiguration(id);
+    }
+
+    @Override
+    public void setHystrixConfiguration(HystrixConfigurationDefinition configuration) {
+        model.setHystrixConfiguration(configuration);
+    }
+
+    @Override
+    public void setHystrixConfigurations(List<HystrixConfigurationDefinition> configurations) {
+        model.setHystrixConfigurations(configurations);
+    }
+
+    @Override
+    public void addHystrixConfiguration(String id, HystrixConfigurationDefinition configuration) {
+        model.addHystrixConfiguration(id, configuration);
+    }
+
+    @Override
+    public Resilience4jConfigurationDefinition getResilience4jConfiguration(String id) {
+        return model.getResilience4jConfiguration(id);
+    }
+
+    @Override
+    public void setResilience4jConfiguration(Resilience4jConfigurationDefinition configuration) {
+        model.setResilience4jConfiguration(configuration);
+    }
+
+    @Override
+    public void setResilience4jConfigurations(List<Resilience4jConfigurationDefinition> configurations) {
+        model.setResilience4jConfigurations(configurations);
+    }
+
+    @Override
+    public void addResilience4jConfiguration(String id, Resilience4jConfigurationDefinition configuration) {
+        model.addResilience4jConfiguration(id, configuration);
+    }
+
+    @Override
+    public List<ValidatorDefinition> getValidators() {
+        return model.getValidators();
+    }
+
+    @Override
+    public void setTransformers(List<TransformerDefinition> transformers) {
+        model.setTransformers(transformers);
+    }
+
+    @Override
+    public List<TransformerDefinition> getTransformers() {
+        return model.getTransformers();
+    }
+
+    @Override
+    public ServiceCallConfigurationDefinition getServiceCallConfiguration(String serviceName) {
+        return model.getServiceCallConfiguration(serviceName);
+    }
+
+    @Override
+    public void setServiceCallConfiguration(ServiceCallConfigurationDefinition configuration) {
+        model.setServiceCallConfiguration(configuration);
+    }
+
+    @Override
+    public void setServiceCallConfigurations(List<ServiceCallConfigurationDefinition> configurations) {
+        model.setServiceCallConfigurations(configurations);
+    }
+
+    @Override
+    public void addServiceCallConfiguration(String serviceName, ServiceCallConfigurationDefinition configuration) {
+        model.addServiceCallConfiguration(serviceName, configuration);
+    }
+
+    @Override
+    public void setRouteFilterPattern(String include, String exclude) {
+        model.setRouteFilterPattern(include, exclude);
+    }
+
+    @Override
+    public void setRouteFilter(Function<RouteDefinition, Boolean> filter) {
+        model.setRouteFilter(filter);
+    }
+
+    @Override
+    public Function<RouteDefinition, Boolean> getRouteFilter() {
+        return model.getRouteFilter();
+    }
 }
diff --git a/integration-tests/core-main/src/main/java/org/apache/camel/quarkus/core/CoreMainResource.java b/integration-tests/core-main/src/main/java/org/apache/camel/quarkus/core/CoreMainResource.java
index 11a4ba8..bf0cb0f 100644
--- a/integration-tests/core-main/src/main/java/org/apache/camel/quarkus/core/CoreMainResource.java
+++ b/integration-tests/core-main/src/main/java/org/apache/camel/quarkus/core/CoreMainResource.java
@@ -38,6 +38,7 @@ import org.apache.camel.Component;
 import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.component.log.LogComponent;
 import org.apache.camel.component.timer.TimerComponent;
+import org.apache.camel.model.ModelCamelContext;
 import org.apache.camel.quarkus.core.runtime.support.MyPair;
 import org.apache.camel.reactive.vertx.VertXReactiveExecutor;
 import org.apache.camel.spi.BeanRepository;
@@ -154,6 +155,13 @@ public class CoreMainResource {
                 .add("routeBuilders", routeBuilders)
                 .add("routes", routes)
                 .add("autoConfigurationLogSummary", main.getMainConfigurationProperties().isAutoConfigurationLogSummary())
+                .add("config", Json.createObjectBuilder()
+                        .add("rest-port",
+                                context.getRestConfiguration().getPort())
+                        .add("resilience4j-sliding-window-size",
+                                context.adapt(ModelCamelContext.class)
+                                        .getResilience4jConfiguration(null)
+                                        .getSlidingWindowSize()))
                 .add("registry", Json.createObjectBuilder()
                         .add("components", componentsInRegistry)
                         .add("dataformats", dataformatsInRegistry)
diff --git a/integration-tests/core-main/src/main/resources/application.properties b/integration-tests/core-main/src/main/resources/application.properties
index 614fd2f..8e996f8 100644
--- a/integration-tests/core-main/src/main/resources/application.properties
+++ b/integration-tests/core-main/src/main/resources/application.properties
@@ -29,6 +29,8 @@ quarkus.camel.main.routes-discovery.exclude-patterns = org/**/*Filtered
 # Camel
 #
 camel.context.name=quarkus-camel-example
+camel.rest.port = 9876
+camel.resilience4j.sliding-window-size = 1234
 
 #
 # Timer
diff --git a/integration-tests/core-main/src/test/java/org/apache/camel/quarkus/core/CoreMainTest.java b/integration-tests/core-main/src/test/java/org/apache/camel/quarkus/core/CoreMainTest.java
index 7313944..0db69c5 100644
--- a/integration-tests/core-main/src/test/java/org/apache/camel/quarkus/core/CoreMainTest.java
+++ b/integration-tests/core-main/src/test/java/org/apache/camel/quarkus/core/CoreMainTest.java
@@ -134,6 +134,16 @@ public class CoreMainTest {
         assertThat(factoryFinderMap)
                 .hasKeySatisfying(doesNotStartWith("META-INF/services/org/apache/camel/properties-component-factory"))
                 .hasKeySatisfying(doesNotStartWith("META-INF/services/org/apache/camel/reactive-executor"));
+
+        // rest properties are configured through CamelContext, this test is to spot changes
+        // done to underlying camel-main implementation that would prevent to configure it
+        // consistently across runtimes using camel-main properties.
+        assertThat(p.getString("config.rest-port")).isEqualTo("9876");
+
+        // resilience4j properties are configured through ModelCamelContext, this test is
+        // to ensure that FastCamelContext won't change in a way it cannot be configured
+        // consistently across runtimes using camel-main properties.
+        assertThat(p.getString("config.resilience4j-sliding-window-size")).isEqualTo("1234");
     }
 
     @Test
diff --git a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/CoreResource.java b/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/CoreResource.java
index 1397b91..3ce78b5 100644
--- a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/CoreResource.java
+++ b/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/CoreResource.java
@@ -29,9 +29,11 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NoSuchLanguageException;
 import org.apache.camel.catalog.RuntimeCamelCatalog;
 import org.apache.camel.component.log.LogComponent;
+import org.apache.camel.model.ModelCamelContext;
 import org.apache.camel.spi.Registry;
 import org.apache.camel.support.processor.DefaultExchangeFormatter;
 
@@ -99,6 +101,30 @@ public class CoreResource {
         return true;
     }
 
+    @Path("/adapt/model-camel-context")
+    @GET
+    @Produces(MediaType.TEXT_PLAIN)
+    public boolean adaptToModelCamelContext() {
+        try {
+            context.adapt(ModelCamelContext.class);
+            return true;
+        } catch (ClassCastException e) {
+            return false;
+        }
+    }
+
+    @Path("/adapt/extended-camel-context")
+    @GET
+    @Produces(MediaType.TEXT_PLAIN)
+    public boolean adaptToExtendedCamelContext() {
+        try {
+            context.adapt(ExtendedCamelContext.class);
+            return true;
+        } catch (ClassCastException e) {
+            return false;
+        }
+    }
+
     @Path("/catalog/{type}/{name}")
     @GET
     @Produces(MediaType.APPLICATION_JSON)
diff --git a/integration-tests/core/src/test/java/org/apache/camel/quarkus/core/CoreTest.java b/integration-tests/core/src/test/java/org/apache/camel/quarkus/core/CoreTest.java
index 1fc3589..791938b 100644
--- a/integration-tests/core/src/test/java/org/apache/camel/quarkus/core/CoreTest.java
+++ b/integration-tests/core/src/test/java/org/apache/camel/quarkus/core/CoreTest.java
@@ -64,4 +64,10 @@ public class CoreTest {
         RestAssured.when().get("/test/catalog/component/timer").then().body(not(emptyOrNullString()));
         RestAssured.when().get("/test/catalog/language/simple").then().body(emptyOrNullString());
     }
+
+    @Test
+    public void testAdaptContext() {
+        RestAssured.when().get("/test/adapt/model-camel-context").then().body(is("true"));
+        RestAssured.when().get("/test/adapt/extended-camel-context").then().body(is("true"));
+    }
 }