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/06/03 09:08:44 UTC
[camel-k-runtime] 01/12: Upgrade to Camel 3.3.0 and camel-quarkus
1.0.0.CR1 #338
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-k-runtime.git
commit 00888b7d6af894c5f2684b002062cc13b8041923
Author: lburgazzoli <lb...@gmail.com>
AuthorDate: Wed May 27 17:53:49 2020 +0200
Upgrade to Camel 3.3.0 and camel-quarkus 1.0.0.CR1 #338
---
.github/workflows/pr-build.yml | 1 +
.../camel/k/loader/java/RoutesLoaderTest.java | 2 +-
.../apache/camel/k/loader/js/RoutesLoaderTest.java | 2 +-
.../org/apache/camel/k/loader/kotlin/LoaderTest.kt | 16 +-
camel-k-loader-yaml/camel-k-loader-yaml/pom.xml | 1 +
.../camel/k/health/HealthContextCustomizer.java | 13 +-
.../apache/camel/k/main/ApplicationRuntime.java | 17 +-
.../quarkus/deployment/DeploymentProcessor.java | 4 +-
.../k/core/quarkus/RuntimeListenerAdapter.java | 20 +-
.../knative/deployment/DeploymentProcessor.java | 35 +-
camel-k-quarkus/camel-k-quarkus-knative/it/pom.xml | 155 ++++++++
.../k/quarkus/knative/deployment/Application.java | 71 ++++
.../it/src/main/resources/application.properties | 36 ++
.../it/src/main/resources/env.json | 13 +
.../k/quarkus/knative/deployment/ExtensionIT.java | 16 +-
.../quarkus/knative/deployment/ExtensionTest.java | 79 ++++
camel-k-quarkus/camel-k-quarkus-knative/pom.xml | 1 +
.../camel-k-quarkus-knative/runtime/pom.xml | 1 +
.../camel/k/quarkus/knative/KnativeRecorder.java | 14 +-
.../quarkus/deployment/DeploymentProcessor.java | 2 +-
.../quarkus/deployment/DeploymentProcessor.java | 2 +-
camel-k-runtime-bom/pom.xml | 2 +-
camel-k-runtime-http/pom.xml | 5 +-
.../java/org/apache/camel/k/http/PlatformHttp.java | 75 ----
.../apache/camel/k/http/PlatformHttpServer.java | 282 --------------
.../k/http/PlatformHttpServiceConfiguration.java | 209 -----------
.../http/PlatformHttpServiceContextCustomizer.java | 46 +--
.../camel/k/http/PlatformHttpServiceEndpoint.java | 123 -------
.../k/http/engine/RuntimePlatformHttpConsumer.java | 408 ---------------------
.../apache/camel/k/http/support/CorsHandler.java | 136 -------
.../k/http/PlatformHttpServiceCustomizerTest.java | 18 +-
camel-knative/camel-knative-api/pom.xml | 14 +-
camel-knative/camel-knative-http/pom.xml | 17 +
.../knative/http/KnativeHttpConsumer.java | 15 +-
.../knative/http/KnativeHttpProducer.java | 10 +-
.../knative/http/KnativeHttpTransport.java | 20 +-
camel-knative/camel-knative/pom.xml | 13 +
.../apache/camel/component/knative/knative.json | 21 +-
.../camel/component/knative/KnativeComponent.java | 6 +-
.../camel/component/knative/KnativeConstants.java | 14 +-
pom.xml | 30 +-
41 files changed, 575 insertions(+), 1390 deletions(-)
diff --git a/.github/workflows/pr-build.yml b/.github/workflows/pr-build.yml
index 31262d8..1c2417f 100644
--- a/.github/workflows/pr-build.yml
+++ b/.github/workflows/pr-build.yml
@@ -62,6 +62,7 @@ jobs:
native-image-project:
- :camel-k-quarkus-core-it
- :camel-k-quarkus-cron-it
+ - :camel-k-quarkus-knative-it
- :camel-k-quarkus-loader-xml-it
- :camel-k-quarkus-loader-yaml-it
- :camel-k-runtime-example-quarkus-xml
diff --git a/camel-k-loader-java/src/test/java/org/apache/camel/k/loader/java/RoutesLoaderTest.java b/camel-k-loader-java/src/test/java/org/apache/camel/k/loader/java/RoutesLoaderTest.java
index 2125f92..a576933 100644
--- a/camel-k-loader-java/src/test/java/org/apache/camel/k/loader/java/RoutesLoaderTest.java
+++ b/camel-k-loader-java/src/test/java/org/apache/camel/k/loader/java/RoutesLoaderTest.java
@@ -126,7 +126,7 @@ public class RoutesLoaderTest {
List<RouteDefinition> routes = builder.getRouteCollection().getRoutes();
assertThat(routes).hasSize(1);
- assertThat(routes.get(0).getInput().getEndpointUri()).isEqualTo("timer:tick");
+ assertThat(routes.get(0).getInput().getEndpointUri()).matches("timer:/*tick");
assertThat(routes.get(0).getOutputs().get(0)).isInstanceOf(ToDefinition.class);
}
diff --git a/camel-k-loader-js/src/test/java/org/apache/camel/k/loader/js/RoutesLoaderTest.java b/camel-k-loader-js/src/test/java/org/apache/camel/k/loader/js/RoutesLoaderTest.java
index fba429b..846daad 100644
--- a/camel-k-loader-js/src/test/java/org/apache/camel/k/loader/js/RoutesLoaderTest.java
+++ b/camel-k-loader-js/src/test/java/org/apache/camel/k/loader/js/RoutesLoaderTest.java
@@ -56,7 +56,7 @@ public class RoutesLoaderTest {
List<RouteDefinition> routes = builder.getRouteCollection().getRoutes();
assertThat(routes).hasSize(1);
- assertThat(routes.get(0).getInput().getEndpointUri()).isEqualTo("timer:tick");
+ assertThat(routes.get(0).getInput().getEndpointUri()).matches("timer:/*tick");
assertThat(routes.get(0).getOutputs().get(0)).isInstanceOf(ToDefinition.class);
}
diff --git a/camel-k-loader-kotlin/src/test/kotlin/org/apache/camel/k/loader/kotlin/LoaderTest.kt b/camel-k-loader-kotlin/src/test/kotlin/org/apache/camel/k/loader/kotlin/LoaderTest.kt
index b4b84ea..d6840fa 100644
--- a/camel-k-loader-kotlin/src/test/kotlin/org/apache/camel/k/loader/kotlin/LoaderTest.kt
+++ b/camel-k-loader-kotlin/src/test/kotlin/org/apache/camel/k/loader/kotlin/LoaderTest.kt
@@ -33,15 +33,15 @@ class LoaderTest {
@Test
fun `load routes`() {
- var runtime = TestRuntime()
- var source = Sources.fromURI("classpath:routes.kts")
+ val runtime = TestRuntime()
+ val source = Sources.fromURI("classpath:routes.kts")
val loader = RoutesConfigurer.load(runtime, source)
assertThat(loader).isInstanceOf(KotlinSourceLoader::class.java)
assertThat(runtime.builders).hasSize(1)
assertThat(runtime.builders[0]).isInstanceOf(RouteBuilder::class.java)
- var builder = runtime.builders[0] as RouteBuilder
+ val builder = runtime.builders[0] as RouteBuilder
builder.context = runtime.camelContext
builder.configure()
@@ -54,23 +54,23 @@ class LoaderTest {
@Test
fun `load routes with endpoint dsl`() {
- var runtime = TestRuntime()
- var source = Sources.fromURI("classpath:routes-with-endpoint-dsl.kts")
+ val runtime = TestRuntime()
+ val source = Sources.fromURI("classpath:routes-with-endpoint-dsl.kts")
val loader = RoutesConfigurer.load(runtime, source)
assertThat(loader).isInstanceOf(KotlinSourceLoader::class.java)
assertThat(runtime.builders).hasSize(1)
assertThat(runtime.builders[0]).isInstanceOf(RouteBuilder::class.java)
- var builder = runtime.builders[0] as RouteBuilder
+ val builder = runtime.builders[0] as RouteBuilder
builder.context = runtime.camelContext
builder.configure()
val routes = builder.routeCollection.routes
assertThat(routes).hasSize(1)
- assertThat(routes[0].input.endpointUri).isEqualTo("timer:tick?period=1s")
+ assertThat(routes[0].input.endpointUri).isEqualTo("timer://tick?period=1s")
assertThat(routes[0].outputs[0]).isInstanceOfSatisfying(ToDefinition::class.java) {
- assertThat(it.endpointUri).isEqualTo("log:info")
+ assertThat(it.endpointUri).isEqualTo("log://info")
}
}
diff --git a/camel-k-loader-yaml/camel-k-loader-yaml/pom.xml b/camel-k-loader-yaml/camel-k-loader-yaml/pom.xml
index 199a2d7..f1ef7b6 100644
--- a/camel-k-loader-yaml/camel-k-loader-yaml/pom.xml
+++ b/camel-k-loader-yaml/camel-k-loader-yaml/pom.xml
@@ -149,6 +149,7 @@
<blacklistedDefinitions>
<blacklistedDefinition>org.apache.camel.model.Resilience4jConfigurationDefinition</blacklistedDefinition>
<blacklistedDefinition>org.apache.camel.model.HystrixConfigurationDefinition</blacklistedDefinition>
+ <blacklistedDefinition>org.apache.camel.model.FaultToleranceConfigurationDefinition</blacklistedDefinition>
<blacklistedDefinition>org.apache.camel.model.OnFallbackDefinition</blacklistedDefinition>
<blacklistedDefinition>org.apache.camel.model.InOnlyDefinition</blacklistedDefinition>
<blacklistedDefinition>org.apache.camel.model.InOutDefinition</blacklistedDefinition>
diff --git a/camel-k-main/camel-k-runtime-health/src/main/java/org/apache/camel/k/health/HealthContextCustomizer.java b/camel-k-main/camel-k-runtime-health/src/main/java/org/apache/camel/k/health/HealthContextCustomizer.java
index 3b88f97..b143c90 100644
--- a/camel-k-main/camel-k-runtime-health/src/main/java/org/apache/camel/k/health/HealthContextCustomizer.java
+++ b/camel-k-main/camel-k-runtime-health/src/main/java/org/apache/camel/k/health/HealthContextCustomizer.java
@@ -26,6 +26,7 @@ import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.Route;
import org.apache.camel.CamelContext;
import org.apache.camel.Ordered;
+import org.apache.camel.component.platform.http.vertx.VertxPlatformHttpRouter;
import org.apache.camel.health.HealthCheck;
import org.apache.camel.health.HealthCheckFilter;
import org.apache.camel.health.HealthCheckHelper;
@@ -35,7 +36,6 @@ import org.apache.camel.impl.health.ContextHealthCheck;
import org.apache.camel.impl.health.RoutesHealthCheckRepository;
import org.apache.camel.k.ContextCustomizer;
import org.apache.camel.k.annotation.Customizer;
-import org.apache.camel.k.http.PlatformHttp;
@Customizer("health")
public class HealthContextCustomizer implements ContextCustomizer {
@@ -111,16 +111,17 @@ public class HealthContextCustomizer implements ContextCustomizer {
// add health route
addRoute(
camelContext,
- PlatformHttp.lookup(camelContext)
+ VertxPlatformHttpRouter.lookup(camelContext)
);
}
- private Route addRoute(CamelContext camelContext, PlatformHttp platformHttp) {
- Route route = platformHttp.router().route(HttpMethod.GET, path);
+ private Route addRoute(CamelContext camelContext, VertxPlatformHttpRouter router) {
+ Route route = router.route(HttpMethod.GET, path);
- // add global handlers first i.e. body handler
- platformHttp.handlers().forEach(route::handler);
+ // add body handler
+ route.handler(router.bodyHandler());
+ // add health endpoint handler
route.handler(routingContext -> {
int code = 200;
diff --git a/camel-k-main/camel-k-runtime-main/src/main/java/org/apache/camel/k/main/ApplicationRuntime.java b/camel-k-main/camel-k-runtime-main/src/main/java/org/apache/camel/k/main/ApplicationRuntime.java
index b3f3578..ab58fb9 100644
--- a/camel-k-main/camel-k-runtime-main/src/main/java/org/apache/camel/k/main/ApplicationRuntime.java
+++ b/camel-k-main/camel-k-runtime-main/src/main/java/org/apache/camel/k/main/ApplicationRuntime.java
@@ -56,6 +56,7 @@ public final class ApplicationRuntime implements Runtime {
this.main = new MainAdapter();
this.main.configure().setXmlRoutes("false");
this.main.configure().setXmlRests("false");
+ this.main.setDefaultPropertyPlaceholderLocation("false");
this.main.setRoutesCollector(new NoRoutesCollector());
this.main.addMainListener(new MainListenerAdapter());
}
@@ -76,12 +77,12 @@ public final class ApplicationRuntime implements Runtime {
@Override
public void addRoutes(RoutesBuilder builder) {
- this.main.addRoutesBuilder(builder);
+ this.main.configure().addRoutesBuilder(builder);
}
@Override
public void addConfiguration(Object configuration) {
- this.main.addConfiguration(configuration);
+ this.main.configure().addConfiguration(configuration);
}
@Override
@@ -130,17 +131,25 @@ public final class ApplicationRuntime implements Runtime {
private final class MainListenerAdapter implements org.apache.camel.main.MainListener {
@Override
- public void beforeConfigure(BaseMainSupport main) {
+ public void beforeInitialize(BaseMainSupport main) {
invokeListeners(Phase.ConfigureProperties);
+ }
+
+ @Override
+ public void beforeConfigure(BaseMainSupport main) {
invokeListeners(Phase.ConfigureRoutes);
}
@Override
- public void configure(CamelContext context) {
+ public void afterConfigure(BaseMainSupport main) {
invokeListeners(Phase.ConfigureContext);
}
@Override
+ public void configure(CamelContext context) {
+ }
+
+ @Override
public void beforeStart(BaseMainSupport main) {
invokeListeners(Phase.Starting);
}
diff --git a/camel-k-quarkus/camel-k-quarkus-core/deployment/src/main/java/org/apache/camel/k/core/quarkus/deployment/DeploymentProcessor.java b/camel-k-quarkus/camel-k-quarkus-core/deployment/src/main/java/org/apache/camel/k/core/quarkus/deployment/DeploymentProcessor.java
index 167daca..63f9f6f 100644
--- a/camel-k-quarkus/camel-k-quarkus-core/deployment/src/main/java/org/apache/camel/k/core/quarkus/deployment/DeploymentProcessor.java
+++ b/camel-k-quarkus/camel-k-quarkus-core/deployment/src/main/java/org/apache/camel/k/core/quarkus/deployment/DeploymentProcessor.java
@@ -30,8 +30,8 @@ import io.quarkus.deployment.builditem.nativeimage.ServiceProviderBuildItem;
import org.apache.camel.k.Constants;
import org.apache.camel.k.Runtime;
import org.apache.camel.k.core.quarkus.RuntimeRecorder;
-import org.apache.camel.quarkus.core.deployment.CamelMainListenerBuildItem;
-import org.apache.camel.quarkus.core.deployment.CamelServicePatternBuildItem;
+import org.apache.camel.quarkus.core.deployment.spi.CamelMainListenerBuildItem;
+import org.apache.camel.quarkus.core.deployment.spi.CamelServicePatternBuildItem;
import org.apache.camel.spi.HasId;
import org.apache.camel.spi.StreamCachingStrategy;
import org.jboss.jandex.IndexView;
diff --git a/camel-k-quarkus/camel-k-quarkus-core/runtime/src/main/java/org/apache/camel/k/core/quarkus/RuntimeListenerAdapter.java b/camel-k-quarkus/camel-k-quarkus-core/runtime/src/main/java/org/apache/camel/k/core/quarkus/RuntimeListenerAdapter.java
index 72a5116..20445f1 100644
--- a/camel-k-quarkus/camel-k-quarkus-core/runtime/src/main/java/org/apache/camel/k/core/quarkus/RuntimeListenerAdapter.java
+++ b/camel-k-quarkus/camel-k-quarkus-core/runtime/src/main/java/org/apache/camel/k/core/quarkus/RuntimeListenerAdapter.java
@@ -49,14 +49,22 @@ public class RuntimeListenerAdapter implements MainListener {
}
@Override
- public void beforeConfigure(BaseMainSupport main) {
+ public void beforeInitialize(BaseMainSupport main) {
invokeListeners(listeners, on(main), Runtime.Phase.ConfigureProperties);
+ }
+
+ @Override
+ public void beforeConfigure(BaseMainSupport main) {
invokeListeners(listeners, on(main), Runtime.Phase.ConfigureRoutes);
}
@Override
+ public void afterConfigure(BaseMainSupport main) {
+ invokeListeners(listeners, on(main), Runtime.Phase.ConfigureContext);
+ }
+
+ @Override
public void configure(CamelContext context) {
- invokeListeners(listeners, on(context), Runtime.Phase.ConfigureContext);
}
@Override
@@ -118,22 +126,22 @@ public class RuntimeListenerAdapter implements MainListener {
@Override
public void addRoutes(RoutesBuilder builder) {
- main.addRoutesBuilder(builder);
+ main.configure().addRoutesBuilder(builder);
}
@Override
public void addConfiguration(Object configuration) {
- main.addConfiguration(configuration);
+ main.configure().addConfiguration(configuration);
}
@Override
public void setInitialProperties(Properties properties) {
- main.getCamelContext().getPropertiesComponent().setInitialProperties(properties);
+ main.setInitialProperties(properties);
}
@Override
public void setProperties(Properties properties) {
- main.getCamelContext().getPropertiesComponent().setOverrideProperties(properties);
+ main.setOverrideProperties(properties);
}
@Override
diff --git a/camel-k-quarkus/camel-k-quarkus-knative/deployment/src/main/java/org/apache/camel/k/quarkus/knative/deployment/DeploymentProcessor.java b/camel-k-quarkus/camel-k-quarkus-knative/deployment/src/main/java/org/apache/camel/k/quarkus/knative/deployment/DeploymentProcessor.java
index 159f946..6237a05 100644
--- a/camel-k-quarkus/camel-k-quarkus-knative/deployment/src/main/java/org/apache/camel/k/quarkus/knative/deployment/DeploymentProcessor.java
+++ b/camel-k-quarkus/camel-k-quarkus-knative/deployment/src/main/java/org/apache/camel/k/quarkus/knative/deployment/DeploymentProcessor.java
@@ -16,7 +16,8 @@
*/
package org.apache.camel.k.quarkus.knative.deployment;
-import io.quarkus.deployment.annotations.BuildProducer;
+import java.util.List;
+
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.annotations.ExecutionTime;
import io.quarkus.deployment.annotations.Record;
@@ -24,19 +25,27 @@ import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
import io.quarkus.vertx.core.deployment.CoreVertxBuildItem;
import io.quarkus.vertx.http.deployment.BodyHandlerBuildItem;
import io.quarkus.vertx.http.deployment.VertxWebRouterBuildItem;
+import org.apache.camel.component.knative.KnativeComponent;
+import org.apache.camel.component.knative.KnativeConstants;
import org.apache.camel.component.knative.spi.KnativeEnvironment;
import org.apache.camel.k.quarkus.knative.KnativeRecorder;
-import org.apache.camel.quarkus.core.deployment.CamelRuntimeBeanBuildItem;
-import org.apache.camel.quarkus.core.deployment.CamelServiceFilter;
-import org.apache.camel.quarkus.core.deployment.CamelServiceFilterBuildItem;
+import org.apache.camel.quarkus.core.deployment.spi.CamelRuntimeBeanBuildItem;
+import org.apache.camel.quarkus.core.deployment.spi.CamelServiceFilter;
+import org.apache.camel.quarkus.core.deployment.spi.CamelServiceFilterBuildItem;
public class DeploymentProcessor {
@BuildStep
- void servicesFilters(BuildProducer<CamelServiceFilterBuildItem> serviceFilter) {
- serviceFilter.produce(
- new CamelServiceFilterBuildItem(CamelServiceFilter.forComponent("knative"))
+ List<ReflectiveClassBuildItem> reflectiveClasses() {
+ return List.of(
+ new ReflectiveClassBuildItem(true, false, KnativeEnvironment.class),
+ new ReflectiveClassBuildItem(true, false, KnativeEnvironment.KnativeServiceDefinition.class)
);
- serviceFilter.produce(
+ }
+
+ @BuildStep
+ List<CamelServiceFilterBuildItem> servicesFilters() {
+ return List.of(
+ new CamelServiceFilterBuildItem(CamelServiceFilter.forComponent(KnativeConstants.SCHEME)),
new CamelServiceFilterBuildItem(CamelServiceFilter.forPathEndingWith(CamelServiceFilter.CAMEL_SERVICE_BASE_PATH + "/knative/transport/http"))
);
}
@@ -50,18 +59,12 @@ public class DeploymentProcessor {
BodyHandlerBuildItem bodyHandlerBuildItem) {
return new CamelRuntimeBeanBuildItem(
- "knative",
- "org.apache.camel.component.knative.KnativeComponent",
+ KnativeConstants.SCHEME,
+ KnativeComponent.class.getName(),
recorder.createKnativeComponent(
vertx.getVertx(),
router.getRouter(),
bodyHandlerBuildItem.getHandler())
);
}
-
- @BuildStep
- void registerReflectiveClasses(BuildProducer<ReflectiveClassBuildItem> reflectiveClass) {
- reflectiveClass.produce(new ReflectiveClassBuildItem(true, false, KnativeEnvironment.class));
- reflectiveClass.produce(new ReflectiveClassBuildItem(true, false, KnativeEnvironment.KnativeServiceDefinition.class));
- }
}
diff --git a/camel-k-quarkus/camel-k-quarkus-knative/it/pom.xml b/camel-k-quarkus/camel-k-quarkus-knative/it/pom.xml
new file mode 100644
index 0000000..b90339c
--- /dev/null
+++ b/camel-k-quarkus/camel-k-quarkus-knative/it/pom.xml
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ 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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <groupId>org.apache.camel.k</groupId>
+ <artifactId>camel-k-quarkus-knative-parent</artifactId>
+ <version>1.3.0-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+
+ <artifactId>camel-k-quarkus-knative-it</artifactId>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.camel.k</groupId>
+ <artifactId>camel-k-quarkus-knative</artifactId>
+ </dependency>
+
+ <!-- quarkus dependencies -->
+ <dependency>
+ <groupId>io.quarkus</groupId>
+ <artifactId>quarkus-resteasy</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>io.quarkus</groupId>
+ <artifactId>quarkus-resteasy-jsonb</artifactId>
+ </dependency>
+
+ <!-- test dependencies -->
+ <dependency>
+ <groupId>io.quarkus</groupId>
+ <artifactId>quarkus-junit5</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>io.rest-assured</groupId>
+ <artifactId>rest-assured</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.assertj</groupId>
+ <artifactId>assertj-core</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ <version>${build-helper-maven-plugin.version}</version>
+ <executions>
+ <execution>
+ <id>reserve-network-port</id>
+ <goals>
+ <goal>reserve-network-port</goal>
+ </goals>
+ <phase>process-resources</phase>
+ <configuration>
+ <portNames>
+ <portName>test.http.port.jvm</portName>
+ <portName>test.http.port.native</portName>
+ </portNames>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>io.quarkus</groupId>
+ <artifactId>quarkus-maven-plugin</artifactId>
+ <version>${quarkus.version}</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>build</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <systemProperties>
+ <quarkus.http.test-port>${test.http.port.jvm}</quarkus.http.test-port>
+ <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
+ </systemProperties>
+ <environmentVariables>
+ <CAMEL_KNATIVE_CONFIGURATION>file:${project.basedir}/src/main/resources/env.json</CAMEL_KNATIVE_CONFIGURATION>
+ </environmentVariables>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <profiles>
+ <profile>
+ <id>native</id>
+ <activation>
+ <property>
+ <name>native</name>
+ </property>
+ </activation>
+ <properties>
+ <quarkus.package.type>native</quarkus.package.type>
+ </properties>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-failsafe-plugin</artifactId>
+ <executions>
+ <execution>
+ <goals>
+ <goal>integration-test</goal>
+ <goal>verify</goal>
+ </goals>
+ <configuration>
+ <systemProperties>
+ <quarkus.http.test-port>${test.http.port.native}</quarkus.http.test-port>
+ <native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path>
+ </systemProperties>
+ <environmentVariables>
+ <CAMEL_KNATIVE_CONFIGURATION>file:${project.basedir}/src/main/resources/env.json</CAMEL_KNATIVE_CONFIGURATION>
+ </environmentVariables>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
+
+
+</project>
diff --git a/camel-k-quarkus/camel-k-quarkus-knative/it/src/main/java/org/apache/camel/k/quarkus/knative/deployment/Application.java b/camel-k-quarkus/camel-k-quarkus-knative/it/src/main/java/org/apache/camel/k/quarkus/knative/deployment/Application.java
new file mode 100644
index 0000000..43f74bb
--- /dev/null
+++ b/camel-k-quarkus/camel-k-quarkus-knative/it/src/main/java/org/apache/camel/k/quarkus/knative/deployment/Application.java
@@ -0,0 +1,71 @@
+/*
+ * 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.k.quarkus.knative.deployment;
+
+import java.util.Map;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+import javax.json.Json;
+import javax.json.JsonObject;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.knative.KnativeEndpoint;
+import org.apache.camel.component.knative.spi.Knative;
+
+
+@Path("/test")
+@ApplicationScoped
+public class Application {
+ @Inject
+ CamelContext context;
+
+ @SuppressWarnings("unchecked")
+ @GET
+ @Path("/inspect")
+ @Consumes(MediaType.TEXT_PLAIN)
+ @Produces(MediaType.APPLICATION_JSON)
+ public JsonObject inspect() {
+ var endpoint = context.getEndpoint("knative:endpoint/from", KnativeEndpoint.class);
+ var envMeta = endpoint.getConfiguration().getEnvironment().lookup(Knative.Type.endpoint, "from")
+ .filter(entry -> Knative.EndpointKind.source.name().equals(entry.getMetadata().get(Knative.CAMEL_ENDPOINT_KIND)))
+ .findFirst()
+ .map(def -> Json.createObjectBuilder((Map)def.getMetadata()))
+ .orElseThrow(IllegalArgumentException::new);
+
+ return Json.createObjectBuilder()
+ .add("env-meta", envMeta)
+ .build();
+ }
+
+ @javax.enterprise.inject.Produces
+ public RouteBuilder routes() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ from("knative:endpoint/from")
+ .transform().body(String.class, b -> b.toUpperCase());
+ }
+ };
+ }
+}
diff --git a/camel-k-quarkus/camel-k-quarkus-knative/it/src/main/resources/application.properties b/camel-k-quarkus/camel-k-quarkus-knative/it/src/main/resources/application.properties
new file mode 100644
index 0000000..b4cc6d4
--- /dev/null
+++ b/camel-k-quarkus/camel-k-quarkus-knative/it/src/main/resources/application.properties
@@ -0,0 +1,36 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+#
+# Quarkus
+#
+quarkus.log.file.enable = false
+quarkus.log.console.enable = false
+quarkus.banner.enabled = false
+
+#
+# Quarkus :: Camel
+#
+quarkus.camel.main.routes-discovery.enabled = false
+
+#
+# Camel
+#
+camel.context.name = camel-k-quarkus-ctx
+
+#
+# Integration
+#
diff --git a/camel-k-quarkus/camel-k-quarkus-knative/it/src/main/resources/env.json b/camel-k-quarkus/camel-k-quarkus-knative/it/src/main/resources/env.json
new file mode 100644
index 0000000..1ba0ae6
--- /dev/null
+++ b/camel-k-quarkus/camel-k-quarkus-knative/it/src/main/resources/env.json
@@ -0,0 +1,13 @@
+{
+ "services": [
+ {
+ "type": "endpoint",
+ "name": "from",
+ "metadata": {
+ "service.path": "/knative",
+ "camel.endpoint.kind": "source",
+ "knative.event.type": "camel.k.evt"
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/camel-k-runtime-http/src/main/java/org/apache/camel/k/http/engine/RuntimePlatformHttpEngine.java b/camel-k-quarkus/camel-k-quarkus-knative/it/src/test/java/org/apache/camel/k/quarkus/knative/deployment/ExtensionIT.java
similarity index 60%
copy from camel-k-runtime-http/src/main/java/org/apache/camel/k/http/engine/RuntimePlatformHttpEngine.java
copy to camel-k-quarkus/camel-k-quarkus-knative/it/src/test/java/org/apache/camel/k/quarkus/knative/deployment/ExtensionIT.java
index 05f8111..c8ad581 100644
--- a/camel-k-runtime-http/src/main/java/org/apache/camel/k/http/engine/RuntimePlatformHttpEngine.java
+++ b/camel-k-quarkus/camel-k-quarkus-knative/it/src/test/java/org/apache/camel/k/quarkus/knative/deployment/ExtensionIT.java
@@ -14,16 +14,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.camel.k.http.engine;
+package org.apache.camel.k.quarkus.knative.deployment;
-import org.apache.camel.Consumer;
-import org.apache.camel.Processor;
-import org.apache.camel.component.platform.http.PlatformHttpEndpoint;
-import org.apache.camel.component.platform.http.spi.PlatformHttpEngine;
+import io.quarkus.test.junit.NativeImageTest;
-public class RuntimePlatformHttpEngine implements PlatformHttpEngine {
- @Override
- public Consumer createConsumer(PlatformHttpEndpoint platformHttpEndpoint, Processor processor) {
- return new RuntimePlatformHttpConsumer(platformHttpEndpoint, processor);
- }
-}
+@NativeImageTest
+public class ExtensionIT extends ExtensionTest {
+}
\ No newline at end of file
diff --git a/camel-k-quarkus/camel-k-quarkus-knative/it/src/test/java/org/apache/camel/k/quarkus/knative/deployment/ExtensionTest.java b/camel-k-quarkus/camel-k-quarkus-knative/it/src/test/java/org/apache/camel/k/quarkus/knative/deployment/ExtensionTest.java
new file mode 100644
index 0000000..9dcb4c2
--- /dev/null
+++ b/camel-k-quarkus/camel-k-quarkus-knative/it/src/test/java/org/apache/camel/k/quarkus/knative/deployment/ExtensionTest.java
@@ -0,0 +1,79 @@
+/*
+ * 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.k.quarkus.knative.deployment;
+
+import java.io.IOException;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+
+import javax.ws.rs.core.MediaType;
+
+import io.quarkus.test.junit.QuarkusTest;
+import io.restassured.RestAssured;
+import io.restassured.path.json.JsonPath;
+import org.apache.camel.Exchange;
+import org.apache.camel.component.knative.spi.CloudEvent;
+import org.apache.camel.component.knative.spi.CloudEvents;
+import org.apache.camel.component.knative.spi.Knative;
+import org.junit.jupiter.api.Test;
+
+import static io.restassured.RestAssured.given;
+import static org.assertj.core.api.Assertions.assertThat;
+
+@QuarkusTest
+public class ExtensionTest {
+ @Test
+ public void inspect() throws IOException {
+ JsonPath p = RestAssured.given()
+ .contentType(MediaType.TEXT_PLAIN)
+ .accept(MediaType.APPLICATION_JSON)
+ .get("/test/inspect")
+ .then()
+ .statusCode(200)
+ .extract()
+ .body()
+ .jsonPath();
+
+ assertThat(p.getMap("env-meta", String.class, String.class))
+ .containsEntry(Knative.KNATIVE_EVENT_TYPE, "camel.k.evt")
+ .containsEntry(Knative.SERVICE_META_PATH, "/knative")
+ .containsEntry("camel.endpoint.kind", "source");
+ }
+
+ @Test
+ public void invoke() {
+ final CloudEvents ce = CloudEvents.v1_0;
+ final String payload = "test";
+
+ String result = given()
+ .body(payload)
+ .header(Exchange.CONTENT_TYPE, "text/plain")
+ .header(ce.mandatoryAttribute(CloudEvent.CAMEL_CLOUD_EVENT_VERSION).http(), ce.v1_0.version())
+ .header(ce.mandatoryAttribute(CloudEvent.CAMEL_CLOUD_EVENT_TYPE).http(), "org.apache.camel.event")
+ .header(ce.mandatoryAttribute(CloudEvent.CAMEL_CLOUD_EVENT_ID).http(), "myEventID")
+ .header(ce.mandatoryAttribute(CloudEvent.CAMEL_CLOUD_EVENT_TIME).http(), DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(ZonedDateTime.now()))
+ .header(ce.mandatoryAttribute(CloudEvent.CAMEL_CLOUD_EVENT_SOURCE).http(), "/somewhere")
+ .when()
+ .post("/knative")
+ .then()
+ .statusCode(200)
+ .extract()
+ .asString();
+
+ assertThat(result).isEqualTo(payload.toUpperCase());
+ }
+}
diff --git a/camel-k-quarkus/camel-k-quarkus-knative/pom.xml b/camel-k-quarkus/camel-k-quarkus-knative/pom.xml
index a6b81b3..8f64b59 100644
--- a/camel-k-quarkus/camel-k-quarkus-knative/pom.xml
+++ b/camel-k-quarkus/camel-k-quarkus-knative/pom.xml
@@ -31,6 +31,7 @@
<modules>
<module>runtime</module>
<module>deployment</module>
+ <module>it</module>
</modules>
</project>
diff --git a/camel-k-quarkus/camel-k-quarkus-knative/runtime/pom.xml b/camel-k-quarkus/camel-k-quarkus-knative/runtime/pom.xml
index 6e2da3b..56e1fef 100644
--- a/camel-k-quarkus/camel-k-quarkus-knative/runtime/pom.xml
+++ b/camel-k-quarkus/camel-k-quarkus-knative/runtime/pom.xml
@@ -59,6 +59,7 @@
<dependency>
<groupId>org.graalvm.nativeimage</groupId>
<artifactId>svm</artifactId>
+ <scope>provided</scope>
</dependency>
</dependencies>
diff --git a/camel-k-quarkus/camel-k-quarkus-knative/runtime/src/main/java/org/apache/camel/k/quarkus/knative/KnativeRecorder.java b/camel-k-quarkus/camel-k-quarkus-knative/runtime/src/main/java/org/apache/camel/k/quarkus/knative/KnativeRecorder.java
index 2ce29c6..edabff7 100644
--- a/camel-k-quarkus/camel-k-quarkus-knative/runtime/src/main/java/org/apache/camel/k/quarkus/knative/KnativeRecorder.java
+++ b/camel-k-quarkus/camel-k-quarkus-knative/runtime/src/main/java/org/apache/camel/k/quarkus/knative/KnativeRecorder.java
@@ -16,7 +16,6 @@
*/
package org.apache.camel.k.quarkus.knative;
-import java.util.Collections;
import java.util.function.Supplier;
import io.quarkus.runtime.RuntimeValue;
@@ -27,7 +26,7 @@ import io.vertx.ext.web.Router;
import io.vertx.ext.web.RoutingContext;
import org.apache.camel.component.knative.KnativeComponent;
import org.apache.camel.component.knative.http.KnativeHttpTransport;
-import org.apache.camel.k.http.PlatformHttp;
+import org.apache.camel.component.platform.http.vertx.VertxPlatformHttpRouter;
@Recorder
public class KnativeRecorder {
@@ -37,11 +36,12 @@ public class KnativeRecorder {
Handler<RoutingContext> bodyHandler) {
KnativeHttpTransport transport = new KnativeHttpTransport();
- transport.setPlatformHttp(new PlatformHttp(
- vertx.get(),
- router.getValue(),
- Collections.singletonList(bodyHandler)
- ));
+ transport.setRouter(new VertxPlatformHttpRouter(vertx.get(), router.getValue()) {
+ @Override
+ public Handler<RoutingContext> bodyHandler() {
+ return bodyHandler;
+ }
+ });
KnativeComponent component = new KnativeComponent();
component.setTransport(transport);
diff --git a/camel-k-quarkus/camel-k-quarkus-loader-xml/deployment/src/main/java/org/apache/camel/k/loader/xml/quarkus/deployment/DeploymentProcessor.java b/camel-k-quarkus/camel-k-quarkus-loader-xml/deployment/src/main/java/org/apache/camel/k/loader/xml/quarkus/deployment/DeploymentProcessor.java
index 6d5a339..26b0389 100644
--- a/camel-k-quarkus/camel-k-quarkus-loader-xml/deployment/src/main/java/org/apache/camel/k/loader/xml/quarkus/deployment/DeploymentProcessor.java
+++ b/camel-k-quarkus/camel-k-quarkus-loader-xml/deployment/src/main/java/org/apache/camel/k/loader/xml/quarkus/deployment/DeploymentProcessor.java
@@ -20,7 +20,7 @@ import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.annotations.ExecutionTime;
import io.quarkus.deployment.annotations.Record;
import org.apache.camel.k.loader.xml.quarkus.XmlLoaderRecorder;
-import org.apache.camel.quarkus.core.deployment.CamelRoutesLoaderBuildItems;
+import org.apache.camel.quarkus.core.deployment.spi.CamelRoutesLoaderBuildItems;
public class DeploymentProcessor {
@BuildStep
diff --git a/camel-k-quarkus/camel-k-quarkus-loader-yaml/deployment/src/main/java/org/apache/camel/k/loader/yaml/quarkus/deployment/DeploymentProcessor.java b/camel-k-quarkus/camel-k-quarkus-loader-yaml/deployment/src/main/java/org/apache/camel/k/loader/yaml/quarkus/deployment/DeploymentProcessor.java
index c49c1c4..0159a0a 100644
--- a/camel-k-quarkus/camel-k-quarkus-loader-yaml/deployment/src/main/java/org/apache/camel/k/loader/yaml/quarkus/deployment/DeploymentProcessor.java
+++ b/camel-k-quarkus/camel-k-quarkus-loader-yaml/deployment/src/main/java/org/apache/camel/k/loader/yaml/quarkus/deployment/DeploymentProcessor.java
@@ -28,7 +28,7 @@ import org.apache.camel.k.loader.yaml.spi.StepParser;
import org.apache.camel.model.DataFormatDefinition;
import org.apache.camel.model.ProcessorDefinition;
import org.apache.camel.model.language.ExpressionDefinition;
-import org.apache.camel.quarkus.core.deployment.CamelServicePatternBuildItem;
+import org.apache.camel.quarkus.core.deployment.spi.CamelServicePatternBuildItem;
import org.jboss.jandex.ClassInfo;
import org.jboss.jandex.DotName;
import org.jboss.jandex.IndexView;
diff --git a/camel-k-runtime-bom/pom.xml b/camel-k-runtime-bom/pom.xml
index 8051ed4..b03e63e 100644
--- a/camel-k-runtime-bom/pom.xml
+++ b/camel-k-runtime-bom/pom.xml
@@ -426,7 +426,7 @@
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-buildtools</artifactId>
- <version>3.1.0</version>
+ <version>3.3.0</version>
</dependency>
</dependencies>
</plugin>
diff --git a/camel-k-runtime-http/pom.xml b/camel-k-runtime-http/pom.xml
index 59f86d1..bffab94 100644
--- a/camel-k-runtime-http/pom.xml
+++ b/camel-k-runtime-http/pom.xml
@@ -41,12 +41,9 @@
<artifactId>camel-core-engine</artifactId>
</dependency>
- <!--
- Replace this with camel-platform-http-vertx when migrating to camel 3.3
- -->
<dependency>
<groupId>org.apache.camel</groupId>
- <artifactId>camel-platform-http</artifactId>
+ <artifactId>camel-platform-http-vertx</artifactId>
</dependency>
<dependency>
diff --git a/camel-k-runtime-http/src/main/java/org/apache/camel/k/http/PlatformHttp.java b/camel-k-runtime-http/src/main/java/org/apache/camel/k/http/PlatformHttp.java
deleted file mode 100644
index 52ab74e..0000000
--- a/camel-k-runtime-http/src/main/java/org/apache/camel/k/http/PlatformHttp.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * 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.k.http;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import io.vertx.core.Handler;
-import io.vertx.core.Vertx;
-import io.vertx.ext.web.Router;
-import io.vertx.ext.web.RoutingContext;
-import org.apache.camel.CamelContext;
-import org.apache.camel.component.platform.http.PlatformHttpConstants;
-import org.apache.camel.support.CamelContextHelper;
-
-public class PlatformHttp {
- public static final String PLATFORM_HTTP_ROUTER_NAME = PlatformHttpConstants.PLATFORM_HTTP_COMPONENT_NAME + "-router";
-
- private final Vertx vertx;
- private final Router router;
- private final List<Handler<RoutingContext>> handlers;
-
- public PlatformHttp(Vertx vertx, Router router) {
- this.vertx = vertx;
- this.router = router;
- this.handlers = Collections.emptyList();
- }
-
- public PlatformHttp(Vertx vertx, Router router, List<Handler<RoutingContext>> handlers) {
- this.vertx = vertx;
- this.router = router;
- this.handlers = Collections.unmodifiableList(new ArrayList<>(handlers));
- }
-
- public Vertx vertx() {
- return vertx;
- }
-
- public Router router() {
- return router;
- }
-
- public List<Handler<RoutingContext>> handlers() {
- return handlers;
- }
-
- // **********************
- //
- // Helpers
- //
- // **********************
-
- public static PlatformHttp lookup(CamelContext camelContext) {
- return CamelContextHelper.mandatoryLookup(
- camelContext,
- PlatformHttp.PLATFORM_HTTP_ROUTER_NAME,
- PlatformHttp.class
- );
- }
-}
diff --git a/camel-k-runtime-http/src/main/java/org/apache/camel/k/http/PlatformHttpServer.java b/camel-k-runtime-http/src/main/java/org/apache/camel/k/http/PlatformHttpServer.java
deleted file mode 100644
index 3710415..0000000
--- a/camel-k-runtime-http/src/main/java/org/apache/camel/k/http/PlatformHttpServer.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * 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.k.http;
-
-import java.io.IOException;
-import java.security.GeneralSecurityException;
-import java.security.KeyStore;
-import java.util.Collections;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutorService;
-
-import javax.net.ssl.KeyManagerFactory;
-import javax.net.ssl.TrustManagerFactory;
-
-import io.vertx.core.Handler;
-import io.vertx.core.Vertx;
-import io.vertx.core.http.HttpServer;
-import io.vertx.core.http.HttpServerOptions;
-import io.vertx.core.net.KeyCertOptions;
-import io.vertx.core.net.TrustOptions;
-import io.vertx.ext.web.Router;
-import io.vertx.ext.web.RoutingContext;
-import io.vertx.ext.web.handler.BodyHandler;
-import org.apache.camel.CamelContext;
-import org.apache.camel.component.platform.http.PlatformHttpConstants;
-import org.apache.camel.support.jsse.KeyManagersParameters;
-import org.apache.camel.support.jsse.SSLContextParameters;
-import org.apache.camel.support.jsse.TrustManagersParameters;
-import org.apache.camel.support.service.ServiceSupport;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public final class PlatformHttpServer extends ServiceSupport {
- private static final Logger LOGGER = LoggerFactory.getLogger(PlatformHttpServer.class);
-
- private final CamelContext context;
- private final PlatformHttpServiceConfiguration configuration;
- private final Vertx vertx;
- private final Router router;
- private final ExecutorService executor;
-
- private HttpServer server;
-
- public PlatformHttpServer(CamelContext context, PlatformHttpServiceConfiguration configuration, Vertx vertx, ExecutorService executor) {
- this.context = context;
- this.configuration = configuration;
- this.vertx = vertx;
- this.router = Router.router(vertx);
- this.executor = executor;
- }
-
- @Override
- protected void doInit() throws Exception {
- final Router subRouter = Router.router(vertx);
-
- if (configuration.getCors().isEnabled()) {
- subRouter.route().handler(new org.apache.camel.k.http.support.CorsHandler(configuration));
- }
-
- router.mountSubRouter(configuration.getPath(), subRouter);
-
- context.getRegistry().bind(
- PlatformHttp.PLATFORM_HTTP_ROUTER_NAME,
- new PlatformHttp(vertx, subRouter, Collections.singletonList(createBodyHandler()))
- );
-
- SSLContextParameters sslParameters = configuration.getSslContextParameters();
- if (sslParameters == null && configuration.isUseGlobalSslContextParameters()) {
- sslParameters = context.getSSLContextParameters();
- }
-
- HttpServerOptions options = new HttpServerOptions();
- if (sslParameters != null) {
- options.setSsl(true);
- options.setKeyCertOptions(createKeyCertOptions(sslParameters));
- options.setTrustOptions(createTrustOptions(sslParameters));
- }
-
- server = vertx.createHttpServer(options);
- }
-
- @Override
- protected void doStart() throws Exception {
- CompletableFuture.runAsync(
- () -> {
- CountDownLatch latch = new CountDownLatch(1);
- server.requestHandler(router).listen(configuration.getBindPort(), configuration.getBindHost(), result -> {
- try {
- if (result.failed()) {
- LOGGER.warn("Failed to start Vert.x HttpServer on {}:{}, reason: {}",
- configuration.getBindHost(),
- configuration.getBindPort(),
- result.cause().getMessage()
- );
-
- throw new RuntimeException(result.cause());
- }
-
- LOGGER.info("Vert.x HttpServer started on {}:{}", configuration.getBindHost(), configuration.getBindPort());
- } finally {
- latch.countDown();
- }
- });
-
- try {
- latch.await();
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- },
- executor
- ).toCompletableFuture().join();
- }
-
- @Override
- protected void doStop() throws Exception {
- try {
- if (server != null) {
- CompletableFuture.runAsync(
- () -> {
- CountDownLatch latch = new CountDownLatch(1);
-
- // remove the platform-http component
- context.removeComponent(PlatformHttpConstants.PLATFORM_HTTP_COMPONENT_NAME);
-
- server.close(result -> {
- try {
- if (result.failed()) {
- LOGGER.warn("Failed to close Vert.x HttpServer reason: {}",
- result.cause().getMessage()
- );
-
- throw new RuntimeException(result.cause());
- }
-
- LOGGER.info("Vert.x HttpServer stopped");
- } finally {
- latch.countDown();
- }
- });
-
- try {
- latch.await();
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- },
- executor
- ).toCompletableFuture().join();
- }
- } finally {
- this.server = null;
- }
- }
-
- private Handler<RoutingContext> createBodyHandler() {
- BodyHandler bodyHandler = BodyHandler.create();
-
- if (configuration.getMaxBodySize() != null) {
- bodyHandler.setBodyLimit(configuration.getMaxBodySize().longValueExact());
- }
-
- bodyHandler.setHandleFileUploads(configuration.getBodyHandler().isHandleFileUploads());
- bodyHandler.setUploadsDirectory(configuration.getBodyHandler().getUploadsDirectory());
- bodyHandler.setDeleteUploadedFilesOnEnd(configuration.getBodyHandler().isDeleteUploadedFilesOnEnd());
- bodyHandler.setMergeFormAttributes(configuration.getBodyHandler().isMergeFormAttributes());
- bodyHandler.setPreallocateBodyBuffer(configuration.getBodyHandler().isPreallocateBodyBuffer());
-
- return new Handler<RoutingContext>() {
- @Override
- public void handle(RoutingContext event) {
- event.request().resume();
- bodyHandler.handle(event);
- }
- };
- }
-
- // *****************************
- //
- // SSL
- //
- // *****************************
-
- private KeyCertOptions createKeyCertOptions(SSLContextParameters sslContextParameters) {
- return new KeyCertOptions() {
- @Override
- public KeyManagerFactory getKeyManagerFactory(Vertx vertx) throws Exception {
- return createKeyManagerFactory(sslContextParameters);
- }
-
- @Override
- public KeyCertOptions clone() {
- return this;
- }
- };
- }
-
- private KeyManagerFactory createKeyManagerFactory(SSLContextParameters sslContextParameters) throws GeneralSecurityException, IOException {
- final KeyManagersParameters keyManagers = sslContextParameters.getKeyManagers();
- if (keyManagers == null) {
- return null;
- }
-
- String kmfAlgorithm = context.resolvePropertyPlaceholders(keyManagers.getAlgorithm());
- if (kmfAlgorithm == null) {
- kmfAlgorithm = KeyManagerFactory.getDefaultAlgorithm();
- }
-
- KeyManagerFactory kmf;
- if (keyManagers.getProvider() == null) {
- kmf = KeyManagerFactory.getInstance(kmfAlgorithm);
- } else {
- kmf = KeyManagerFactory.getInstance(kmfAlgorithm, context.resolvePropertyPlaceholders(keyManagers.getProvider()));
- }
-
- char[] kmfPassword = null;
- if (keyManagers.getKeyPassword() != null) {
- kmfPassword = context.resolvePropertyPlaceholders(keyManagers.getKeyPassword()).toCharArray();
- }
-
- KeyStore ks = keyManagers.getKeyStore() == null ? null : keyManagers.getKeyStore().createKeyStore();
-
- kmf.init(ks, kmfPassword);
- return kmf;
- }
-
- private TrustOptions createTrustOptions(SSLContextParameters sslContextParameters) {
- return new TrustOptions() {
- @Override
- public TrustOptions clone() {
- return this;
- }
-
- @Override
- public TrustManagerFactory getTrustManagerFactory(Vertx vertx) throws Exception {
- return createTrustManagerFactory(sslContextParameters);
- }
- };
- }
-
- private TrustManagerFactory createTrustManagerFactory(SSLContextParameters sslContextParameters) throws GeneralSecurityException, IOException {
- final TrustManagersParameters trustManagers = sslContextParameters.getTrustManagers();
- if (trustManagers == null) {
- return null;
- }
-
- TrustManagerFactory tmf = null;
-
- if (trustManagers.getKeyStore() != null) {
- String tmfAlgorithm = context.resolvePropertyPlaceholders(trustManagers.getAlgorithm());
- if (tmfAlgorithm == null) {
- tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
- }
-
- if (trustManagers.getProvider() == null) {
- tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
- } else {
- tmf = TrustManagerFactory.getInstance(tmfAlgorithm, context.resolvePropertyPlaceholders(trustManagers.getProvider()));
- }
-
- KeyStore ks = trustManagers.getKeyStore() == null ? null : trustManagers.getKeyStore().createKeyStore();
- tmf.init(ks);
- }
-
- return tmf;
- }
-}
diff --git a/camel-k-runtime-http/src/main/java/org/apache/camel/k/http/PlatformHttpServiceConfiguration.java b/camel-k-runtime-http/src/main/java/org/apache/camel/k/http/PlatformHttpServiceConfiguration.java
deleted file mode 100644
index 9001d2d..0000000
--- a/camel-k-runtime-http/src/main/java/org/apache/camel/k/http/PlatformHttpServiceConfiguration.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * 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.k.http;
-
-import java.math.BigInteger;
-import java.time.Duration;
-import java.util.List;
-
-import org.apache.camel.support.jsse.SSLContextParameters;
-
-public class PlatformHttpServiceConfiguration {
- public static final String DEFAULT_BIND_HOST = "0.0.0.0";
- public static final int DEFAULT_BIND_PORT = 8081;
- public static final String DEFAULT_PATH = "/";
-
- private String bindHost = DEFAULT_BIND_HOST;
- private int bindPort = DEFAULT_BIND_PORT;
- private String path = DEFAULT_PATH;
- private BigInteger maxBodySize;
-
- private SSLContextParameters sslContextParameters;
- private boolean useGlobalSslContextParameters;
-
- private CorsConfiguration corsConfiguration = new CorsConfiguration();
- private BodyHandlerConfiguration bodyHandlerConfiguration = new BodyHandlerConfiguration();
-
- public String getBindHost() {
- return bindHost;
- }
-
- public void setBindHost(String bindHost) {
- this.bindHost = bindHost;
- }
-
- public int getBindPort() {
- return bindPort;
- }
-
- public void setBindPort(int bindPort) {
- this.bindPort = bindPort;
- }
-
- public String getPath() {
- return path;
- }
-
- public void setPath(String path) {
- this.path = path;
- }
-
- public BigInteger getMaxBodySize() {
- return maxBodySize;
- }
-
- public void setMaxBodySize(BigInteger maxBodySize) {
- this.maxBodySize = maxBodySize;
- }
-
- public SSLContextParameters getSslContextParameters() {
- return sslContextParameters;
- }
-
- public void setSslContextParameters(SSLContextParameters sslContextParameters) {
- this.sslContextParameters = sslContextParameters;
- }
-
- public boolean isUseGlobalSslContextParameters() {
- return useGlobalSslContextParameters;
- }
-
- public void setUseGlobalSslContextParameters(boolean useGlobalSslContextParameters) {
- this.useGlobalSslContextParameters = useGlobalSslContextParameters;
- }
-
- public CorsConfiguration getCors() {
- return corsConfiguration;
- }
-
- public void setCors(CorsConfiguration corsConfiguration) {
- this.corsConfiguration = corsConfiguration;
- }
-
- public BodyHandlerConfiguration getBodyHandler() {
- return bodyHandlerConfiguration;
- }
-
- public void setBodyHandler(BodyHandlerConfiguration bodyHandler) {
- this.bodyHandlerConfiguration = bodyHandler;
- }
-
- public static class CorsConfiguration {
- private boolean enabled;
- private List<String> origins;
- private List<String> methods;
- private List<String> headers;
- private List<String> exposedHeaders;
- private Duration accessControlMaxAge;
-
- public boolean isEnabled() {
- return enabled;
- }
-
- public void setEnabled(boolean enabled) {
- this.enabled = enabled;
- }
-
- public List<String> getOrigins() {
- return origins;
- }
-
- public void setOrigins(List<String> origins) {
- this.origins = origins;
- }
-
- public List<String> getMethods() {
- return methods;
- }
-
- public void setMethods(List<String> methods) {
- this.methods = methods;
- }
-
- public List<String> getHeaders() {
- return headers;
- }
-
- public List<String> getExposedHeaders() {
- return exposedHeaders;
- }
-
- public void setExposedHeaders(List<String> exposedHeaders) {
- this.exposedHeaders = exposedHeaders;
- }
-
- public void setHeaders(List<String> headers) {
- this.headers = headers;
- }
-
- public Duration getAccessControlMaxAge() {
- return accessControlMaxAge;
- }
-
- public void setAccessControlMaxAge(Duration accessControlMaxAge) {
- this.accessControlMaxAge = accessControlMaxAge;
- }
- }
-
- public static class BodyHandlerConfiguration {
- private boolean handleFileUploads = true;
- private String uploadsDirectory = "file-uploads";
- private boolean mergeFormAttributes = true;
- private boolean deleteUploadedFilesOnEnd;
- private boolean preallocateBodyBuffer = true;
-
- public boolean isHandleFileUploads() {
- return handleFileUploads;
- }
-
- public void setHandleFileUploads(boolean handleFileUploads) {
- this.handleFileUploads = handleFileUploads;
- }
-
- public String getUploadsDirectory() {
- return uploadsDirectory;
- }
-
- public void setUploadsDirectory(String uploadsDirectory) {
- this.uploadsDirectory = uploadsDirectory;
- }
-
- public boolean isMergeFormAttributes() {
- return mergeFormAttributes;
- }
-
- public void setMergeFormAttributes(boolean mergeFormAttributes) {
- this.mergeFormAttributes = mergeFormAttributes;
- }
-
- public boolean isDeleteUploadedFilesOnEnd() {
- return deleteUploadedFilesOnEnd;
- }
-
- public void setDeleteUploadedFilesOnEnd(boolean deleteUploadedFilesOnEnd) {
- this.deleteUploadedFilesOnEnd = deleteUploadedFilesOnEnd;
- }
-
- public boolean isPreallocateBodyBuffer() {
- return preallocateBodyBuffer;
- }
-
- public void setPreallocateBodyBuffer(boolean preallocateBodyBuffer) {
- this.preallocateBodyBuffer = preallocateBodyBuffer;
- }
- }
-}
diff --git a/camel-k-runtime-http/src/main/java/org/apache/camel/k/http/PlatformHttpServiceContextCustomizer.java b/camel-k-runtime-http/src/main/java/org/apache/camel/k/http/PlatformHttpServiceContextCustomizer.java
index a74ff0e..d753c0e 100644
--- a/camel-k-runtime-http/src/main/java/org/apache/camel/k/http/PlatformHttpServiceContextCustomizer.java
+++ b/camel-k-runtime-http/src/main/java/org/apache/camel/k/http/PlatformHttpServiceContextCustomizer.java
@@ -16,22 +16,19 @@
*/
package org.apache.camel.k.http;
-import java.util.Map;
-
import org.apache.camel.CamelContext;
-import org.apache.camel.Endpoint;
import org.apache.camel.Ordered;
import org.apache.camel.component.platform.http.PlatformHttpComponent;
import org.apache.camel.component.platform.http.PlatformHttpConstants;
+import org.apache.camel.component.platform.http.vertx.VertxPlatformHttpEngine;
+import org.apache.camel.component.platform.http.vertx.VertxPlatformHttpServer;
+import org.apache.camel.component.platform.http.vertx.VertxPlatformHttpServerConfiguration;
import org.apache.camel.k.ContextCustomizer;
import org.apache.camel.k.annotation.Customizer;
-import org.apache.camel.k.http.engine.RuntimePlatformHttpEngine;
@Customizer("platform-http")
-public class PlatformHttpServiceContextCustomizer extends PlatformHttpServiceConfiguration implements ContextCustomizer {
- private PlatformHttpServiceEndpoint endpoint;
-
+public class PlatformHttpServiceContextCustomizer extends VertxPlatformHttpServerConfiguration implements ContextCustomizer {
public PlatformHttpServiceContextCustomizer() {
}
@@ -42,33 +39,24 @@ public class PlatformHttpServiceContextCustomizer extends PlatformHttpServiceCon
@Override
public void apply(CamelContext camelContext) {
- endpoint = new PlatformHttpServiceEndpoint(camelContext, this);
- //endpoint.init();
-
try {
- camelContext.addService(endpoint);
+ camelContext.addService(new VertxPlatformHttpServer(this) {
+ @Override
+ protected void doInit() throws Exception {
+ initializeServer();
+ }
+ @Override
+ protected void doStart() throws Exception {
+ startServer();
+ }
+ });
} catch (Exception e) {
throw new RuntimeException(e);
}
- camelContext.addComponent(PlatformHttpConstants.PLATFORM_HTTP_COMPONENT_NAME, new PlatformHttpComponentWrapper());
- }
-
- public static final class PlatformHttpComponentWrapper extends PlatformHttpComponent {
- public PlatformHttpComponentWrapper() {
- setEngine(new RuntimePlatformHttpEngine());
- }
-
- @Override
- protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
- // the PlatformHttpComponent set this value but it is not handled which cause the
- // context to fail as the property cannot be bound to the enpoint.
- //
- // TODO: fix upstream
- parameters.remove("optionsEnabled");
+ PlatformHttpComponent component = new PlatformHttpComponent(camelContext);
+ component.setEngine(new VertxPlatformHttpEngine());
- // let the original component to create the endpoint
- return super.createEndpoint(uri, remaining, parameters);
- }
+ camelContext.getRegistry().bind(PlatformHttpConstants.PLATFORM_HTTP_COMPONENT_NAME, component);
}
}
diff --git a/camel-k-runtime-http/src/main/java/org/apache/camel/k/http/PlatformHttpServiceEndpoint.java b/camel-k-runtime-http/src/main/java/org/apache/camel/k/http/PlatformHttpServiceEndpoint.java
deleted file mode 100644
index 9658753..0000000
--- a/camel-k-runtime-http/src/main/java/org/apache/camel/k/http/PlatformHttpServiceEndpoint.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * 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.k.http;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Future;
-
-import io.vertx.core.Vertx;
-import io.vertx.core.VertxOptions;
-import org.apache.camel.CamelContext;
-import org.apache.camel.support.CamelContextHelper;
-import org.apache.camel.support.service.ServiceSupport;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class PlatformHttpServiceEndpoint extends ServiceSupport {
- private static final Logger LOGGER = LoggerFactory.getLogger(PlatformHttpServiceEndpoint.class);
-
- private final CamelContext context;
- private final PlatformHttpServiceConfiguration configuration;
-
- private Vertx vertx;
- private boolean localVertx;
- private PlatformHttpServer vertxHttpServer;
- private ExecutorService executor;
-
- public PlatformHttpServiceEndpoint(CamelContext context, PlatformHttpServiceConfiguration configuration) {
- this.context = context;
- this.configuration = configuration;
- }
-
- @Override
- protected void doInit() throws Exception {
- vertx = CamelContextHelper.findByType(context, Vertx.class);
- executor = context.getExecutorServiceManager().newSingleThreadExecutor(this, "platform-http-service");
-
- if (vertx != null) {
- LOGGER.info("Found Vert.x instance in registry: {}", vertx);
- } else {
- VertxOptions options = CamelContextHelper.findByType(context, VertxOptions.class);
- if (options == null) {
- options = new VertxOptions();
- }
-
- LOGGER.info("Creating new Vert.x instance");
-
- vertx = Vertx.vertx(options);
- localVertx = true;
- }
-
- vertxHttpServer = new PlatformHttpServer(context, configuration, vertx, executor);
- vertxHttpServer.init();
- }
-
- @Override
- protected void doStart() throws Exception {
- vertxHttpServer.start();
- }
-
- @Override
- protected void doStop() throws Exception {
- if (vertxHttpServer != null) {
- vertxHttpServer.stop();
- }
-
- if (vertx != null && localVertx) {
- Future<?> future = executor.submit(
- () -> {
- CountDownLatch latch = new CountDownLatch(1);
-
- vertx.close(result -> {
- try {
- if (result.failed()) {
- LOGGER.warn("Failed to close Vert.x reason: {}",
- result.cause().getMessage()
- );
-
- throw new RuntimeException(result.cause());
- }
-
- LOGGER.info("Vert.x stopped");
- } finally {
- latch.countDown();
- }
- });
-
- try {
- latch.await();
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- }
- );
-
- try {
- future.get();
- } finally {
- vertx = null;
- localVertx = false;
- }
- }
-
- if (executor != null) {
- context.getExecutorServiceManager().shutdown(executor);
- executor = null;
- }
- }
-}
diff --git a/camel-k-runtime-http/src/main/java/org/apache/camel/k/http/engine/RuntimePlatformHttpConsumer.java b/camel-k-runtime-http/src/main/java/org/apache/camel/k/http/engine/RuntimePlatformHttpConsumer.java
deleted file mode 100644
index f325a91..0000000
--- a/camel-k-runtime-http/src/main/java/org/apache/camel/k/http/engine/RuntimePlatformHttpConsumer.java
+++ /dev/null
@@ -1,408 +0,0 @@
-/*
- * 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.k.http.engine;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.nio.ByteBuffer;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Pattern;
-
-import io.vertx.core.MultiMap;
-import io.vertx.core.buffer.Buffer;
-import io.vertx.core.http.HttpMethod;
-import io.vertx.core.http.HttpServerRequest;
-import io.vertx.core.http.HttpServerResponse;
-import io.vertx.ext.web.Route;
-import io.vertx.ext.web.RoutingContext;
-import org.apache.camel.Exchange;
-import org.apache.camel.Message;
-import org.apache.camel.NoTypeConversionAvailableException;
-import org.apache.camel.Processor;
-import org.apache.camel.TypeConversionException;
-import org.apache.camel.TypeConverter;
-import org.apache.camel.component.platform.http.PlatformHttpEndpoint;
-import org.apache.camel.component.platform.http.spi.Method;
-import org.apache.camel.k.http.PlatformHttp;
-import org.apache.camel.spi.HeaderFilterStrategy;
-import org.apache.camel.support.DefaultConsumer;
-import org.apache.camel.support.DefaultMessage;
-import org.apache.camel.support.ExchangeHelper;
-import org.apache.camel.support.MessageHelper;
-import org.apache.camel.support.ObjectHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class RuntimePlatformHttpConsumer extends DefaultConsumer {
- private static final Logger LOG = LoggerFactory.getLogger(RuntimePlatformHttpConsumer.class);
- private static final Pattern PATH_PARAMETER_PATTERN = Pattern.compile("\\{([^/}]+)\\}");
-
- private Route route;
-
- public RuntimePlatformHttpConsumer(PlatformHttpEndpoint endpoint, Processor processor) {
- super(endpoint, processor);
- }
-
- @Override
- public PlatformHttpEndpoint getEndpoint() {
- return (PlatformHttpEndpoint) super.getEndpoint();
- }
-
- @Override
- protected void doInit() throws Exception {
- super.doStart();
-
- final PlatformHttpEndpoint endpoint = getEndpoint();
- final PlatformHttp router = PlatformHttp.lookup(endpoint.getCamelContext());
- final String path = endpoint.getPath();
- final String vertxPathParamPath = PATH_PARAMETER_PATTERN.matcher(path).replaceAll(":$1");
- final Route newRoute = router.router().route(vertxPathParamPath);
-
- router.handlers().forEach(newRoute::handler);
-
- final Set<Method> methods = Method.parseList(endpoint.getHttpMethodRestrict());
- if (!methods.equals(Method.getAll())) {
- methods.stream().forEach(m -> newRoute.method(HttpMethod.valueOf(m.name())));
- }
- if (endpoint.getConsumes() != null) {
- newRoute.consumes(endpoint.getConsumes());
- }
- if (endpoint.getProduces() != null) {
- newRoute.produces(endpoint.getProduces());
- }
-
- newRoute.handler(
- ctx -> {
- Exchange exchg = null;
- try {
- final Exchange exchange = exchg = toExchange(ctx);
- createUoW(exchange);
- getAsyncProcessor().process(
- exchange,
- doneSync -> writeResponse(ctx, exchange, getEndpoint().getHeaderFilterStrategy()));
- } catch (Exception e) {
- ctx.fail(e);
- getExceptionHandler().handleException("Failed handling platform-http endpoint " + path, exchg, e);
- } finally {
- if (exchg != null) {
- doneUoW(exchg);
- }
- }
- });
-
- this.route = newRoute;
- }
-
- @Override
- protected void doStop() throws Exception {
- if (route != null) {
- route.remove();
- route = null;
- }
- super.doStop();
- }
-
- @Override
- protected void doSuspend() throws Exception {
- if (route != null) {
- route.disable();
- }
- super.doSuspend();
- }
-
- @Override
- protected void doResume() throws Exception {
- if (route != null) {
- route.enable();
- }
- super.doResume();
- }
-
- static Object toHttpResponse(HttpServerResponse response, Message message, HeaderFilterStrategy headerFilterStrategy) {
- final Exchange exchange = message.getExchange();
- final TypeConverter tc = exchange.getContext().getTypeConverter();
- final int code = determineResponseCode(exchange, message.getBody());
-
- response.setStatusCode(code);
-
- // copy headers from Message to Response
- if (headerFilterStrategy != null) {
- for (Map.Entry<String, Object> entry : message.getHeaders().entrySet()) {
- final String key = entry.getKey();
- final Object value = entry.getValue();
- // use an iterator as there can be multiple values. (must not use a delimiter)
- final Iterator<?> it = ObjectHelper.createIterator(value, null);
-
- String firstValue = null;
- List<String> values = null;
-
- while (it.hasNext()) {
- final String headerValue = tc.convertTo(String.class, it.next());
- if (headerValue != null
- && !headerFilterStrategy.applyFilterToCamelHeaders(key, headerValue, exchange)) {
- if (firstValue == null) {
- firstValue = headerValue;
- } else {
- if (values == null) {
- values = new ArrayList<>();
- values.add(firstValue);
- }
- values.add(headerValue);
- }
- }
- }
- if (values != null) {
- response.putHeader(key, values);
- } else if (firstValue != null) {
- response.putHeader(key, firstValue);
- }
- }
- }
-
- Object body = message.getBody();
- final Exception exception = exchange.getException();
-
- if (exception != null) {
- // we failed due an exception so print it as plain text
- final StringWriter sw = new StringWriter();
- final PrintWriter pw = new PrintWriter(sw);
-
- exception.printStackTrace(pw);
-
- // the body should then be the stacktrace
- body = ByteBuffer.wrap(sw.toString().getBytes(StandardCharsets.UTF_8));
- // force content type to be text/plain as that is what the stacktrace is
- message.setHeader(Exchange.CONTENT_TYPE, "text/plain; charset=utf-8");
-
- // and mark the exception as failure handled, as we handled it by returning it as the response
- ExchangeHelper.setFailureHandled(exchange);
- }
-
- // set the content-length if it can be determined, or chunked encoding
- final Integer length = determineContentLength(exchange, body);
- if (length != null) {
- response.putHeader("Content-Length", String.valueOf(length));
- } else {
- response.setChunked(true);
- }
-
- // set the content type in the response.
- final String contentType = MessageHelper.getContentType(message);
- if (contentType != null) {
- // set content-type
- response.putHeader("Content-Type", contentType);
- }
- return body;
- }
-
- static Integer determineContentLength(Exchange camelExchange, Object body) {
- if (body instanceof byte[]) {
- return ((byte[]) body).length;
- } else if (body instanceof ByteBuffer) {
- return ((ByteBuffer) body).remaining();
- }
- return null;
- }
-
- /*
- * Copied from org.apache.camel.http.common.DefaultHttpBinding.determineResponseCode(Exchange, Object)
- * If DefaultHttpBinding.determineResponseCode(Exchange, Object) is moved to a module without the servlet-api
- * dependency we could eventually consume it from there.
- */
- static int determineResponseCode(Exchange camelExchange, Object body) {
- boolean failed = camelExchange.isFailed();
- int defaultCode = failed ? 500 : 200;
-
- Message message = camelExchange.getMessage();
- Integer currentCode = message.getHeader(Exchange.HTTP_RESPONSE_CODE, Integer.class);
- int codeToUse = currentCode == null ? defaultCode : currentCode;
-
- if (codeToUse != 500) {
- if ((body == null) || (body instanceof String && ((String) body).trim().isEmpty())) {
- // no content
- codeToUse = currentCode == null ? 204 : currentCode;
- }
- }
-
- return codeToUse;
- }
-
- static void writeResponse(RoutingContext ctx, Exchange camelExchange, HeaderFilterStrategy headerFilterStrategy) {
- final Object body = toHttpResponse(ctx.response(), camelExchange.getMessage(), headerFilterStrategy);
-
- final HttpServerResponse response = ctx.response();
- if (body == null) {
- LOG.trace("No payload to send as reply for exchange: {}", camelExchange);
- response.end();
- } else if (body instanceof String) {
- response.end((String) body);
- } else if (body instanceof InputStream) {
- final byte[] bytes = new byte[4096];
- try (InputStream in = (InputStream) body) {
- int len;
- while ((len = in.read(bytes)) >= 0) {
- response.write(Buffer.buffer(len).appendBytes(bytes, 0, len));
- }
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- response.end();
- } else {
- final TypeConverter tc = camelExchange.getContext().getTypeConverter();
- try {
- final ByteBuffer bb = tc.mandatoryConvertTo(ByteBuffer.class, body);
- response.end(Buffer.buffer(bb.capacity()).setBytes(0, bb));
- } catch (TypeConversionException | NoTypeConversionAvailableException e) {
- throw new RuntimeException(e);
- }
- }
-
- }
-
- private Exchange toExchange(RoutingContext ctx) {
- final Exchange exchange = getEndpoint().createExchange();
- Message in = toCamelMessage(ctx, exchange);
-
- final String charset = ctx.parsedHeaders().contentType().parameter("charset");
- if (charset != null) {
- exchange.setProperty(Exchange.CHARSET_NAME, charset);
- in.setHeader(Exchange.HTTP_CHARACTER_ENCODING, charset);
- }
-
- exchange.setIn(in);
- return exchange;
- }
-
- private Message toCamelMessage(RoutingContext ctx, Exchange exchange) {
- final Message result = new DefaultMessage(exchange);
-
- final HeaderFilterStrategy headerFilterStrategy = getEndpoint().getHeaderFilterStrategy();
- populateCamelHeaders(ctx, result.getHeaders(), exchange, headerFilterStrategy);
- final String mimeType = ctx.parsedHeaders().contentType().value();
- final boolean isMultipartFormData = "multipart/form-data".equals(mimeType);
- if ("application/x-www-form-urlencoded".equals(mimeType) || isMultipartFormData) {
- final MultiMap formData = ctx.request().formAttributes();
- final Map<String, Object> body = new HashMap<>();
- for (String key : formData.names()) {
- for (String value : formData.getAll(key)) {
- if (headerFilterStrategy != null
- && !headerFilterStrategy.applyFilterToExternalHeaders(key, value, exchange)) {
- appendHeader(result.getHeaders(), key, value);
- appendHeader(body, key, value);
- }
- }
- }
- result.setBody(body);
- if (isMultipartFormData) {
- //populateAttachments(ctx.fileUploads(), result);
- }
- } else {
- // extract body by myself if undertow parser didn't handle and the method is allowed to have one
- // body is extracted as byte[] then auto TypeConverter kicks in
- Method m = Method.valueOf(ctx.request().method().name());
- if (m.canHaveBody()) {
- final Buffer body = ctx.getBody();
- if (body != null) {
- result.setBody(body.getBytes());
- }
- } else {
- result.setBody(null);
- }
- }
- return result;
- }
-
- static void populateCamelHeaders(
- RoutingContext ctx,
- Map<String, Object> headersMap,
- Exchange exchange,
- HeaderFilterStrategy headerFilterStrategy) {
-
- final HttpServerRequest request = ctx.request();
- headersMap.put(Exchange.HTTP_PATH, request.path());
-
- if (headerFilterStrategy != null) {
- final MultiMap requestHeaders = request.headers();
- final String authz = requestHeaders.get("authorization");
- // store a special header that this request was authenticated using HTTP Basic
- if (authz != null && authz.trim().startsWith("Basic")) {
- if (!headerFilterStrategy.applyFilterToExternalHeaders(Exchange.AUTHENTICATION, "Basic", exchange)) {
- appendHeader(headersMap, Exchange.AUTHENTICATION, "Basic");
- }
- }
- for (String name : requestHeaders.names()) {
- // add the headers one by one, and use the header filter strategy
- for (String value : requestHeaders.getAll(name)) {
- if (!headerFilterStrategy.applyFilterToExternalHeaders(name.toString(), value, exchange)) {
- appendHeader(headersMap, name.toString(), value);
- }
- }
- }
-
- // process uri parameters as headers
- final MultiMap pathParameters = ctx.queryParams();
- // continue if the map is not empty, otherwise there are no params
- if (!pathParameters.isEmpty()) {
- for (String name : pathParameters.names()) {
- for (String value : pathParameters.getAll(name)) {
- if (!headerFilterStrategy.applyFilterToExternalHeaders(name, value, exchange)) {
- appendHeader(headersMap, name, value);
- }
- }
- }
- }
- }
-
- // Path parameters
- ctx.pathParams().forEach((k, v) -> appendHeader(headersMap, k, v));
-
- // NOTE: these headers is applied using the same logic as camel-http/camel-jetty to be consistent
- headersMap.put(Exchange.HTTP_METHOD, request.method().toString());
- // strip query parameters from the uri
- headersMap.put(Exchange.HTTP_URL, request.absoluteURI());
- // uri is without the host and port
- headersMap.put(Exchange.HTTP_URI, request.uri());
- headersMap.put(Exchange.HTTP_QUERY, request.query());
- headersMap.put(Exchange.HTTP_RAW_QUERY, request.query());
- }
-
- @SuppressWarnings("unchecked")
- static void appendHeader(Map<String, Object> headers, String key, Object value) {
- if (headers.containsKey(key)) {
- Object existing = headers.get(key);
- List<Object> list;
- if (existing instanceof List) {
- list = (List<Object>) existing;
- } else {
- list = new ArrayList<>();
- list.add(existing);
- }
- list.add(value);
- value = list;
- }
-
- headers.put(key, value);
- }
-}
diff --git a/camel-k-runtime-http/src/main/java/org/apache/camel/k/http/support/CorsHandler.java b/camel-k-runtime-http/src/main/java/org/apache/camel/k/http/support/CorsHandler.java
deleted file mode 100644
index f206b3f..0000000
--- a/camel-k-runtime-http/src/main/java/org/apache/camel/k/http/support/CorsHandler.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * 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.k.http.support;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Pattern;
-
-import io.vertx.core.Handler;
-import io.vertx.core.http.HttpHeaders;
-import io.vertx.core.http.HttpMethod;
-import io.vertx.core.http.HttpServerRequest;
-import io.vertx.core.http.HttpServerResponse;
-import io.vertx.ext.web.RoutingContext;
-import org.apache.camel.k.http.PlatformHttpServiceConfiguration;
-import org.apache.camel.util.ObjectHelper;
-
-public class CorsHandler implements Handler<RoutingContext> {
-
- private static final Pattern COMMA_SEPARATED_SPLIT_REGEX = Pattern.compile("\\s*,\\s*");
-
- // This is set in the recorder at runtime.
- // Must be static because the filter is created(deployed) at build time and runtime config is still not available
- final PlatformHttpServiceConfiguration.CorsConfiguration corsConfig;
-
- public CorsHandler(PlatformHttpServiceConfiguration configuration) {
- this.corsConfig = ObjectHelper.notNull(configuration.getCors(), "config");
- }
-
- private void processRequestedHeaders(HttpServerResponse response, String allowHeadersValue) {
- if (ObjectHelper.isEmpty(corsConfig.getHeaders())) {
- response.headers().set(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, allowHeadersValue);
- } else {
- List<String> requestedHeaders = new ArrayList<>();
- for (String requestedHeader : COMMA_SEPARATED_SPLIT_REGEX.split(allowHeadersValue)) {
- requestedHeaders.add(requestedHeader.toLowerCase());
- }
-
- List<String> validRequestedHeaders = new ArrayList<>();
- for (String configHeader : corsConfig.getHeaders()) {
- if (requestedHeaders.contains(configHeader.toLowerCase())) {
- validRequestedHeaders.add(configHeader);
- }
- }
-
- if (!validRequestedHeaders.isEmpty()) {
- response.headers().set(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, String.join(",", validRequestedHeaders));
- }
- }
- }
-
- private void processMethods(HttpServerResponse response, String allowMethodsValue) {
- if (ObjectHelper.isEmpty(corsConfig.getMethods())) {
- response.headers().set(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, allowMethodsValue);
- } else {
- List<String> requestedMethods = new ArrayList<>();
- for (String requestedMethod : COMMA_SEPARATED_SPLIT_REGEX.split(allowMethodsValue)) {
- requestedMethods.add(requestedMethod.toLowerCase());
- }
-
- List<String> validRequestedMethods = new ArrayList<>();
- for (String configMethod : corsConfig.getMethods()) {
- if (requestedMethods.contains(configMethod.toLowerCase())) {
- validRequestedMethods.add(configMethod);
- }
- }
-
- if (!validRequestedMethods.isEmpty()) {
- response.headers().set(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, String.join(",", validRequestedMethods));
- }
- }
- }
-
- @Override
- public void handle(RoutingContext event) {
- final HttpServerRequest request = event.request();
- final HttpServerResponse response = event.response();
- final String origin = request.getHeader(HttpHeaders.ORIGIN);
-
- if (origin == null) {
- event.next();
- } else {
- final String requestedMethods = request.getHeader(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD);
-
- if (requestedMethods != null) {
- processMethods(response, requestedMethods);
- }
-
- final String requestedHeaders = request.getHeader(HttpHeaders.ACCESS_CONTROL_REQUEST_HEADERS);
-
- if (requestedHeaders != null) {
- processRequestedHeaders(response, requestedHeaders);
- }
-
- boolean allowsOrigin = ObjectHelper.isEmpty(corsConfig.getOrigins()) || corsConfig.getOrigins().contains(origin);
-
- if (allowsOrigin) {
- response.headers().set(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, origin);
- }
-
- response.headers().set(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
-
-
- if (ObjectHelper.isNotEmpty(corsConfig.getExposedHeaders())) {
- response.headers().set(
- HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS,
- String.join(",", corsConfig.getExposedHeaders()));
- }
-
- if (request.method().equals(HttpMethod.OPTIONS)) {
- if ((requestedHeaders != null || requestedMethods != null) && corsConfig.getAccessControlMaxAge() != null) {
- response.putHeader(
- HttpHeaders.ACCESS_CONTROL_MAX_AGE,
- String.valueOf(corsConfig.getAccessControlMaxAge().getSeconds()));
- }
- response.end();
- } else {
- event.next();
- }
- }
- }
-}
\ No newline at end of file
diff --git a/camel-k-runtime-http/src/test/java/org/apache/camel/k/http/PlatformHttpServiceCustomizerTest.java b/camel-k-runtime-http/src/test/java/org/apache/camel/k/http/PlatformHttpServiceCustomizerTest.java
index 460e44e..d8afd69 100644
--- a/camel-k-runtime-http/src/test/java/org/apache/camel/k/http/PlatformHttpServiceCustomizerTest.java
+++ b/camel-k-runtime-http/src/test/java/org/apache/camel/k/http/PlatformHttpServiceCustomizerTest.java
@@ -26,9 +26,10 @@ import org.apache.camel.CamelContext;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.platform.http.PlatformHttpComponent;
import org.apache.camel.component.platform.http.PlatformHttpConstants;
+import org.apache.camel.component.platform.http.vertx.VertxPlatformHttpEngine;
+import org.apache.camel.component.platform.http.vertx.VertxPlatformHttpRouter;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.k.Runtime;
-import org.apache.camel.k.http.engine.RuntimePlatformHttpEngine;
import org.apache.camel.k.test.AvailablePortFinder;
import org.apache.camel.support.jsse.KeyManagersParameters;
import org.apache.camel.support.jsse.KeyStoreParameters;
@@ -64,7 +65,7 @@ public class PlatformHttpServiceCustomizerTest {
try {
runtime.getCamelContext().start();
- PlatformHttp.lookup(runtime.getCamelContext()).router().route(HttpMethod.GET, "/my/path")
+ VertxPlatformHttpRouter.lookup(runtime.getCamelContext()).route(HttpMethod.GET, "/my/path")
.handler(routingContext -> {
JsonObject response = new JsonObject();
response.put("status", "UP");
@@ -106,7 +107,7 @@ public class PlatformHttpServiceCustomizerTest {
PlatformHttpComponent c = runtime.getCamelContext().getComponent(PlatformHttpConstants.PLATFORM_HTTP_COMPONENT_NAME, PlatformHttpComponent.class);
assertThat(c).isNotNull();
- assertThat(c.getEngine()).isInstanceOf(RuntimePlatformHttpEngine.class);
+ assertThat(c.getEngine()).isInstanceOf(VertxPlatformHttpEngine.class);
try {
runtime.getCamelContext().start();
@@ -142,7 +143,7 @@ public class PlatformHttpServiceCustomizerTest {
PlatformHttpComponent c = runtime.getCamelContext().getComponent(PlatformHttpConstants.PLATFORM_HTTP_COMPONENT_NAME, PlatformHttpComponent.class);
assertThat(c).isNotNull();
- assertThat(c.getEngine()).isInstanceOf(RuntimePlatformHttpEngine.class);
+ assertThat(c.getEngine()).isInstanceOf(VertxPlatformHttpEngine.class);
try {
runtime.getCamelContext().start();
@@ -168,17 +169,16 @@ public class PlatformHttpServiceCustomizerTest {
httpService.setBindPort(AvailablePortFinder.getNextAvailable());
httpService.apply(runtime.getCamelContext());
- PlatformHttp.lookup(runtime.getCamelContext())
- .router()
- .route(HttpMethod.GET, "/my/path")
- .handler(routingContext -> routingContext.response().setStatusCode(200).end());
+ //VertxPlatformHttpRouter.lookup(runtime.getCamelContext())
+ // .route(HttpMethod.GET, "/my/path")
+ // .handler(routingContext -> routingContext.response().setStatusCode(200).end());
assertThatExceptionOfType(ConnectException.class).isThrownBy(
() -> {
given()
.port(httpService.getBindPort())
.when()
- .get("/my/path")
+ .get("/")
.then()
.extract();
}
diff --git a/camel-knative/camel-knative-api/pom.xml b/camel-knative/camel-knative-api/pom.xml
index 4ca5b01..93434ba 100644
--- a/camel-knative/camel-knative-api/pom.xml
+++ b/camel-knative/camel-knative-api/pom.xml
@@ -76,6 +76,18 @@
<build>
<plugins>
<plugin>
+ <groupId>org.jboss.jandex</groupId>
+ <artifactId>jandex-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>make-index</id>
+ <goals>
+ <goal>jandex</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
<groupId>org.apache.camel</groupId>
<artifactId>camel-package-maven-plugin</artifactId>
<version>${camel.version}</version>
@@ -86,7 +98,7 @@
<execution>
<id>generate</id>
<goals>
- <goal>generate-component</goal>
+ <goal>generate-configurer</goal>
</goals>
<phase>process-classes</phase>
</execution>
diff --git a/camel-knative/camel-knative-http/pom.xml b/camel-knative/camel-knative-http/pom.xml
index 12f6b5d..087d432 100644
--- a/camel-knative/camel-knative-http/pom.xml
+++ b/camel-knative/camel-knative-http/pom.xml
@@ -114,6 +114,23 @@
</execution>
</executions>
</plugin>
+ <plugin>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-package-maven-plugin</artifactId>
+ <version>${camel.version}</version>
+ <configuration>
+ <failFast>false</failFast>
+ </configuration>
+ <executions>
+ <execution>
+ <id>generate</id>
+ <goals>
+ <goal>generate-configurer</goal>
+ </goals>
+ <phase>process-classes</phase>
+ </execution>
+ </executions>
+ </plugin>
</plugins>
</build>
diff --git a/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpConsumer.java b/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpConsumer.java
index 810abcc..4764e40 100644
--- a/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpConsumer.java
+++ b/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpConsumer.java
@@ -37,7 +37,7 @@ import org.apache.camel.NoTypeConversionAvailableException;
import org.apache.camel.Processor;
import org.apache.camel.TypeConverter;
import org.apache.camel.component.knative.spi.KnativeEnvironment;
-import org.apache.camel.k.http.PlatformHttp;
+import org.apache.camel.component.platform.http.vertx.VertxPlatformHttpRouter;
import org.apache.camel.spi.HeaderFilterStrategy;
import org.apache.camel.support.DefaultConsumer;
import org.apache.camel.support.DefaultMessage;
@@ -53,7 +53,7 @@ public class KnativeHttpConsumer extends DefaultConsumer {
private final KnativeHttpTransport transport;
private final Predicate<HttpServerRequest> filter;
private final KnativeEnvironment.KnativeServiceDefinition serviceDefinition;
- private final PlatformHttp platformHttp;
+ private final VertxPlatformHttpRouter router;
private final HeaderFilterStrategy headerFilterStrategy;
private String basePath;
@@ -63,14 +63,14 @@ public class KnativeHttpConsumer extends DefaultConsumer {
KnativeHttpTransport transport,
Endpoint endpoint,
KnativeEnvironment.KnativeServiceDefinition serviceDefinition,
- PlatformHttp platformHttp,
+ VertxPlatformHttpRouter router,
Processor processor) {
super(endpoint, processor);
this.transport = transport;
this.serviceDefinition = serviceDefinition;
- this.platformHttp = platformHttp;
+ this.router = router;
this.headerFilterStrategy = new KnativeHttpHeaderFilterStrategy();
this.filter = KnativeHttpSupport.createFilter(serviceDefinition);
}
@@ -100,14 +100,15 @@ public class KnativeHttpConsumer extends DefaultConsumer {
LOGGER.debug("Creating route for path: {}", path);
- route = platformHttp.router().route(
+ route = router.route(
HttpMethod.POST,
path
);
- // add common handlers
- platformHttp.handlers().forEach(route::handler);
+ // add body handler
+ route.handler(router.bodyHandler());
+ // add knative handler
route.handler(routingContext -> {
LOGGER.debug("Handling {}", routingContext);
diff --git a/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpProducer.java b/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpProducer.java
index d7e696e..d707a51 100644
--- a/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpProducer.java
+++ b/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpProducer.java
@@ -19,6 +19,7 @@ package org.apache.camel.component.knative.http;
import java.util.Map;
import io.vertx.core.MultiMap;
+import io.vertx.core.Vertx;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.http.HttpHeaders;
import io.vertx.ext.web.client.HttpResponse;
@@ -31,7 +32,6 @@ import org.apache.camel.Exchange;
import org.apache.camel.InvalidPayloadException;
import org.apache.camel.Message;
import org.apache.camel.component.knative.spi.KnativeEnvironment;
-import org.apache.camel.k.http.PlatformHttp;
import org.apache.camel.spi.HeaderFilterStrategy;
import org.apache.camel.support.DefaultAsyncProducer;
import org.apache.camel.support.DefaultMessage;
@@ -46,7 +46,7 @@ public class KnativeHttpProducer extends DefaultAsyncProducer {
private final KnativeHttpTransport transport;
private final KnativeEnvironment.KnativeServiceDefinition serviceDefinition;
- private final PlatformHttp platformHttp;
+ private final Vertx vertx;
private final WebClientOptions clientOptions;
private final HeaderFilterStrategy headerFilterStrategy;
@@ -56,13 +56,13 @@ public class KnativeHttpProducer extends DefaultAsyncProducer {
KnativeHttpTransport transport,
Endpoint endpoint,
KnativeEnvironment.KnativeServiceDefinition serviceDefinition,
- PlatformHttp platformHttp,
+ Vertx vertx,
WebClientOptions clientOptions) {
super(endpoint);
this.transport = transport;
this.serviceDefinition = serviceDefinition;
- this.platformHttp = ObjectHelper.notNull(platformHttp, "vertx");
+ this.vertx = ObjectHelper.notNull(vertx, "vertx");
this.clientOptions = ObjectHelper.supplyIfEmpty(clientOptions, WebClientOptions::new);
this.headerFilterStrategy = new KnativeHttpHeaderFilterStrategy();
}
@@ -166,7 +166,7 @@ public class KnativeHttpProducer extends DefaultAsyncProducer {
protected void doInit() throws Exception {
super.doInit();
- this.client = WebClient.create(platformHttp.vertx(), clientOptions);
+ this.client = WebClient.create(vertx, clientOptions);
}
@Override
diff --git a/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpTransport.java b/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpTransport.java
index 039a719..1666d7a 100644
--- a/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpTransport.java
+++ b/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpTransport.java
@@ -26,26 +26,26 @@ import org.apache.camel.Producer;
import org.apache.camel.component.knative.spi.KnativeEnvironment;
import org.apache.camel.component.knative.spi.KnativeTransport;
import org.apache.camel.component.knative.spi.KnativeTransportConfiguration;
-import org.apache.camel.k.http.PlatformHttp;
+import org.apache.camel.component.platform.http.vertx.VertxPlatformHttpRouter;
import org.apache.camel.support.service.ServiceSupport;
public class KnativeHttpTransport extends ServiceSupport implements CamelContextAware, KnativeTransport {
public static final int DEFAULT_PORT = 8080;
public static final String DEFAULT_PATH = "/";
- private PlatformHttp platformHttp;
+ private VertxPlatformHttpRouter router;
private WebClientOptions vertxHttpClientOptions;
private CamelContext camelContext;
public KnativeHttpTransport() {
}
- public PlatformHttp getPlatformHttp() {
- return platformHttp;
+ public VertxPlatformHttpRouter getRouter() {
+ return router;
}
- public void setPlatformHttp(PlatformHttp platformHttp) {
- this.platformHttp = platformHttp;
+ public void setRouter(VertxPlatformHttpRouter router) {
+ this.router = router;
}
public WebClientOptions getClientOptions() {
@@ -74,8 +74,8 @@ public class KnativeHttpTransport extends ServiceSupport implements CamelContext
@Override
protected void doStart() throws Exception {
- if (this.platformHttp == null) {
- this.platformHttp = PlatformHttp.lookup(camelContext);
+ if (this.router == null) {
+ this.router = VertxPlatformHttpRouter.lookup(camelContext);
}
}
@@ -91,7 +91,7 @@ public class KnativeHttpTransport extends ServiceSupport implements CamelContext
@Override
public Producer createProducer(Endpoint endpoint, KnativeTransportConfiguration config, KnativeEnvironment.KnativeServiceDefinition service) {
- return new KnativeHttpProducer(this, endpoint, service, this.platformHttp, vertxHttpClientOptions);
+ return new KnativeHttpProducer(this, endpoint, service, this.router.vertx(), vertxHttpClientOptions);
}
@Override
@@ -102,7 +102,7 @@ public class KnativeHttpTransport extends ServiceSupport implements CamelContext
next = KnativeHttpSupport.withoutCloudEventHeaders(next, config.getCloudEvent());
}
- return new KnativeHttpConsumer(this, endpoint, service, this.platformHttp, next);
+ return new KnativeHttpConsumer(this, endpoint, service, this.router, next);
}
}
diff --git a/camel-knative/camel-knative/pom.xml b/camel-knative/camel-knative/pom.xml
index f1d2301..03d56c8 100644
--- a/camel-knative/camel-knative/pom.xml
+++ b/camel-knative/camel-knative/pom.xml
@@ -80,6 +80,18 @@
<build>
<plugins>
<plugin>
+ <groupId>org.jboss.jandex</groupId>
+ <artifactId>jandex-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>make-index</id>
+ <goals>
+ <goal>jandex</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
<groupId>org.apache.camel</groupId>
<artifactId>camel-package-maven-plugin</artifactId>
<version>${camel.version}</version>
@@ -91,6 +103,7 @@
<id>generate</id>
<goals>
<goal>generate-component</goal>
+ <goal>generate-configurer</goal>
</goals>
<phase>process-classes</phase>
</execution>
diff --git a/camel-knative/camel-knative/src/generated/resources/org/apache/camel/component/knative/knative.json b/camel-knative/camel-knative/src/generated/resources/org/apache/camel/component/knative/knative.json
index 0a54039..a0cd44d 100644
--- a/camel-knative/camel-knative/src/generated/resources/org/apache/camel/component/knative/knative.json
+++ b/camel-knative/camel-knative/src/generated/resources/org/apache/camel/component/knative/knative.json
@@ -2,22 +2,23 @@
"component": {
"kind": "component",
"name": "knative",
- "scheme": "knative",
- "extendsScheme": "",
- "syntax": "knative:type\/name",
"title": "Knative",
"description": "This component allows to interact with KNative events.",
- "label": "cloud,eventing",
"deprecated": false,
- "async": false,
- "consumerOnly": false,
- "producerOnly": false,
- "lenientProperties": false,
- "javaType": "org.apache.camel.component.knative.KnativeComponent",
"firstVersion": "3.0.0",
+ "label": "cloud,eventing",
+ "javaType": "org.apache.camel.component.knative.KnativeComponent",
+ "supportLevel": "Preview",
"groupId": "org.apache.camel.k",
"artifactId": "camel-knative",
- "version": "1.3.0-SNAPSHOT"
+ "version": "1.3.0-SNAPSHOT",
+ "scheme": "knative",
+ "extendsScheme": "",
+ "syntax": "knative:type\/name",
+ "async": false,
+ "consumerOnly": false,
+ "producerOnly": false,
+ "lenientProperties": false
},
"componentProperties": {
"transport": { "kind": "property", "displayName": "Transport", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.knative.spi.KnativeTransport", "deprecated": false, "secret": false, "defaultValue": "http", "description": "The transport implementation." },
diff --git a/camel-knative/camel-knative/src/main/java/org/apache/camel/component/knative/KnativeComponent.java b/camel-knative/camel-knative/src/main/java/org/apache/camel/component/knative/KnativeComponent.java
index 8b30ee6..63b8e8b 100644
--- a/camel-knative/camel-knative/src/main/java/org/apache/camel/component/knative/KnativeComponent.java
+++ b/camel-knative/camel-knative/src/main/java/org/apache/camel/component/knative/KnativeComponent.java
@@ -37,10 +37,8 @@ import org.apache.camel.util.StringHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-@Component("knative")
+@Component(KnativeConstants.SCHEME)
public class KnativeComponent extends DefaultComponent {
- public static final String CONFIGURATION_ENV_VARIABLE = "CAMEL_KNATIVE_CONFIGURATION";
-
private static final Logger LOGGER = LoggerFactory.getLogger(KnativeComponent.class);
private KnativeConfiguration configuration;
@@ -259,7 +257,7 @@ public class KnativeComponent extends DefaultComponent {
}
if (conf.getEnvironment() == null) {
- String envConfig = System.getenv(CONFIGURATION_ENV_VARIABLE);
+ String envConfig = System.getenv(KnativeConstants.CONFIGURATION_ENV_VARIABLE);
if (environmentPath != null) {
conf.setEnvironment(
KnativeEnvironment.mandatoryLoadFromResource(getCamelContext(), this.environmentPath)
diff --git a/camel-k-runtime-http/src/main/java/org/apache/camel/k/http/engine/RuntimePlatformHttpEngine.java b/camel-knative/camel-knative/src/main/java/org/apache/camel/component/knative/KnativeConstants.java
similarity index 61%
rename from camel-k-runtime-http/src/main/java/org/apache/camel/k/http/engine/RuntimePlatformHttpEngine.java
rename to camel-knative/camel-knative/src/main/java/org/apache/camel/component/knative/KnativeConstants.java
index 05f8111..2d5e5ce 100644
--- a/camel-k-runtime-http/src/main/java/org/apache/camel/k/http/engine/RuntimePlatformHttpEngine.java
+++ b/camel-knative/camel-knative/src/main/java/org/apache/camel/component/knative/KnativeConstants.java
@@ -14,16 +14,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.camel.k.http.engine;
+package org.apache.camel.component.knative;
-import org.apache.camel.Consumer;
-import org.apache.camel.Processor;
-import org.apache.camel.component.platform.http.PlatformHttpEndpoint;
-import org.apache.camel.component.platform.http.spi.PlatformHttpEngine;
+public final class KnativeConstants {
+ public static final String SCHEME = "knative";
+ public static final String CONFIGURATION_ENV_VARIABLE = "CAMEL_KNATIVE_CONFIGURATION";
-public class RuntimePlatformHttpEngine implements PlatformHttpEngine {
- @Override
- public Consumer createConsumer(PlatformHttpEndpoint platformHttpEndpoint, Processor processor) {
- return new RuntimePlatformHttpConsumer(platformHttpEndpoint, processor);
+ private KnativeConstants() {
}
}
diff --git a/pom.xml b/pom.xml
index 9f816a2..5d4f985 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,8 +39,8 @@
<maven.compiler.target>11</maven.compiler.target>
<kotlin.compiler.target>1.8</kotlin.compiler.target>
- <camel.version>3.2.0</camel.version>
- <camel-quarkus.version>1.0.0-M7</camel-quarkus.version>
+ <camel.version>3.3.0</camel.version>
+ <camel-quarkus.version>1.0.0-CR1</camel-quarkus.version>
<catalog.version>${camel.version}</catalog.version>
<junit.version>5.6.2</junit.version>
<joor.version>0.9.13</joor.version>
@@ -60,9 +60,9 @@
<jaxb-core.version>2.3.0.1</jaxb-core.version>
<immutables.version>2.8.8</immutables.version>
<semver4j.version>3.1.0</semver4j.version>
- <vertx.version>3.8.5</vertx.version>
+ <vertx.version>3.9.0</vertx.version>
<graalvm.version>19.3.1</graalvm.version>
- <quarkus.version>1.4.1.Final</quarkus.version>
+ <quarkus.version>1.5.0.Final</quarkus.version>
<jandex.version>2.1.3.Final</jandex.version>
<javapoet.version>1.11.1</javapoet.version>
<rest-assured.version>4.3.0</rest-assured.version>
@@ -271,6 +271,17 @@
<enabled>false</enabled>
</releases>
</repository>
+ <repository>
+ <id>apache.staging</id>
+ <url>https://repository.apache.org/content/repositories/orgapachecamel-1216</url>
+ <name>Apache Staging Repo</name>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ <releases>
+ <enabled>true</enabled>
+ </releases>
+ </repository>
</repositories>
<pluginRepositories>
@@ -284,6 +295,17 @@
<enabled>false</enabled>
</releases>
</pluginRepository>
+ <pluginRepository>
+ <id>apache.staging</id>
+ <url>https://repository.apache.org/content/repositories/orgapachecamel-1216</url>
+ <name>Apache Staging Repo</name>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ <releases>
+ <enabled>true</enabled>
+ </releases>
+ </pluginRepository>
</pluginRepositories>
<dependencyManagement>