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
The following commit(s) were added to refs/heads/master by this push: new 7d6a1d5 kotlin: improve rest dsl 7d6a1d5 is described below commit 7d6a1d5ba631abe290c85332e7628513db7b1dfb Author: lburgazzoli <lburgazz...@gmail.com> AuthorDate: Wed Oct 16 13:52:29 2019 +0200 kotlin: improve rest dsl --- .../k/loader/groovy/dsl/RestConfiguration.groovy | 3 +- .../k/loader/kotlin/dsl/BeansConfiguration.kt | 4 +- .../k/loader/kotlin/dsl/ContextConfiguration.kt | 4 +- .../loader/kotlin/dsl/IntegrationConfiguration.kt | 9 ++++- .../camel/k/loader/kotlin/dsl/RestConfiguration.kt | 9 ++--- .../k/loader/kotlin/dsl/RestVerbConfiguration.kt | 45 ++++++++++++++++++++++ .../camel/k/loader/kotlin/dsl/IntegrationTest.kt | 27 ++++++++++++- .../src/test/resources/routes-with-rest.kts | 12 ++++++ 8 files changed, 100 insertions(+), 13 deletions(-) diff --git a/camel-k-loader-groovy/src/main/groovy/org/apache/camel/k/loader/groovy/dsl/RestConfiguration.groovy b/camel-k-loader-groovy/src/main/groovy/org/apache/camel/k/loader/groovy/dsl/RestConfiguration.groovy index f693ac6..a9e82e9 100644 --- a/camel-k-loader-groovy/src/main/groovy/org/apache/camel/k/loader/groovy/dsl/RestConfiguration.groovy +++ b/camel-k-loader-groovy/src/main/groovy/org/apache/camel/k/loader/groovy/dsl/RestConfiguration.groovy @@ -18,7 +18,6 @@ package org.apache.camel.k.loader.groovy.dsl import org.apache.camel.builder.RouteBuilder import org.apache.camel.model.rest.RestConfigurationDefinition -import org.apache.camel.model.rest.RestDefinition class RestConfiguration extends RestVerbConfiguration { RestConfiguration(RouteBuilder builder) { @@ -37,7 +36,7 @@ class RestConfiguration extends RestVerbConfiguration { callable.call() } - def path(String path, @DelegatesTo(RestDefinition) Closure<?> callable) { + def path(String path, @DelegatesTo(RestVerbConfiguration) Closure<?> callable) { callable.resolveStrategy = Closure.DELEGATE_FIRST callable.delegate = new RestVerbConfiguration(builder, path) callable.call() diff --git a/camel-k-loader-kotlin/src/main/kotlin/org/apache/camel/k/loader/kotlin/dsl/BeansConfiguration.kt b/camel-k-loader-kotlin/src/main/kotlin/org/apache/camel/k/loader/kotlin/dsl/BeansConfiguration.kt index 044280f..13de3a7 100644 --- a/camel-k-loader-kotlin/src/main/kotlin/org/apache/camel/k/loader/kotlin/dsl/BeansConfiguration.kt +++ b/camel-k-loader-kotlin/src/main/kotlin/org/apache/camel/k/loader/kotlin/dsl/BeansConfiguration.kt @@ -22,7 +22,9 @@ import org.apache.camel.Predicate import org.apache.camel.Processor import org.apache.camel.builder.endpoint.EndpointBuilderFactory -class BeansConfiguration(val context: CamelContext) : EndpointBuilderFactory { +class BeansConfiguration( + val context: CamelContext) : EndpointBuilderFactory { + inline fun <reified T : Any> bean(name: String, block: T.() -> Unit) { var bean = T::class.java.newInstance() bean.block() diff --git a/camel-k-loader-kotlin/src/main/kotlin/org/apache/camel/k/loader/kotlin/dsl/ContextConfiguration.kt b/camel-k-loader-kotlin/src/main/kotlin/org/apache/camel/k/loader/kotlin/dsl/ContextConfiguration.kt index e701ad4..847c945 100644 --- a/camel-k-loader-kotlin/src/main/kotlin/org/apache/camel/k/loader/kotlin/dsl/ContextConfiguration.kt +++ b/camel-k-loader-kotlin/src/main/kotlin/org/apache/camel/k/loader/kotlin/dsl/ContextConfiguration.kt @@ -19,7 +19,9 @@ package org.apache.camel.k.loader.kotlin.dsl import org.apache.camel.CamelContext import org.apache.camel.spi.Registry -class ContextConfiguration (val registry: Registry, val context: CamelContext) { +class ContextConfiguration ( + private val context: CamelContext, + private val registry: Registry) { fun registry(block: RegistryConfiguration.() -> Unit): RegistryConfiguration { val delegate = RegistryConfiguration(registry) diff --git a/camel-k-loader-kotlin/src/main/kotlin/org/apache/camel/k/loader/kotlin/dsl/IntegrationConfiguration.kt b/camel-k-loader-kotlin/src/main/kotlin/org/apache/camel/k/loader/kotlin/dsl/IntegrationConfiguration.kt index 6eb100f..da2f45c 100644 --- a/camel-k-loader-kotlin/src/main/kotlin/org/apache/camel/k/loader/kotlin/dsl/IntegrationConfiguration.kt +++ b/camel-k-loader-kotlin/src/main/kotlin/org/apache/camel/k/loader/kotlin/dsl/IntegrationConfiguration.kt @@ -22,6 +22,7 @@ import org.apache.camel.builder.endpoint.EndpointBuilderFactory import org.apache.camel.builder.endpoint.EndpointRouteBuilder import org.apache.camel.k.loader.kotlin.KotlinCompilationConfiguration import org.apache.camel.model.* +import org.apache.camel.model.rest.RestDefinition import org.apache.camel.spi.Registry import kotlin.script.experimental.annotations.KotlinScript @@ -30,16 +31,20 @@ abstract class IntegrationConfiguration( private val registry : Registry, private val builder : EndpointRouteBuilder) : BuilderSupport(builder.context), Support, EndpointBuilderFactory { + fun rest(): RestDefinition { + return builder.rest() + } + fun rest(block: RestConfiguration.() -> Unit) { RestConfiguration(builder).block() } fun beans(block: BeansConfiguration.() -> Unit) { - BeansConfiguration(context = context).block() + BeansConfiguration(context).block() } fun context(block: ContextConfiguration.() -> Unit) { - ContextConfiguration(context = context, registry = registry).block() + ContextConfiguration(context, registry).block() } fun from(uri: String): RouteDefinition { diff --git a/camel-k-loader-kotlin/src/main/kotlin/org/apache/camel/k/loader/kotlin/dsl/RestConfiguration.kt b/camel-k-loader-kotlin/src/main/kotlin/org/apache/camel/k/loader/kotlin/dsl/RestConfiguration.kt index d70aa0c..737b9db 100644 --- a/camel-k-loader-kotlin/src/main/kotlin/org/apache/camel/k/loader/kotlin/dsl/RestConfiguration.kt +++ b/camel-k-loader-kotlin/src/main/kotlin/org/apache/camel/k/loader/kotlin/dsl/RestConfiguration.kt @@ -18,9 +18,9 @@ package org.apache.camel.k.loader.kotlin.dsl import org.apache.camel.builder.RouteBuilder import org.apache.camel.model.rest.RestConfigurationDefinition -import org.apache.camel.model.rest.RestDefinition -class RestConfiguration(val builder: RouteBuilder) { +class RestConfiguration( + private val builder: RouteBuilder) : RestVerbConfiguration(builder, builder.rest()) { fun configuration(block: RestConfigurationDefinition.() -> Unit) { val delegate = builder.restConfiguration() @@ -32,8 +32,7 @@ class RestConfiguration(val builder: RouteBuilder) { delegate.block() } - fun path(path: String, block: RestDefinition.() -> Unit) { - val delegate = builder.rest(path) - delegate.block() + fun path(path: String, block: RestVerbConfiguration.() -> Unit) { + RestVerbConfiguration(builder, path).block() } } \ No newline at end of file diff --git a/camel-k-loader-kotlin/src/main/kotlin/org/apache/camel/k/loader/kotlin/dsl/RestVerbConfiguration.kt b/camel-k-loader-kotlin/src/main/kotlin/org/apache/camel/k/loader/kotlin/dsl/RestVerbConfiguration.kt new file mode 100644 index 0000000..42e728c --- /dev/null +++ b/camel-k-loader-kotlin/src/main/kotlin/org/apache/camel/k/loader/kotlin/dsl/RestVerbConfiguration.kt @@ -0,0 +1,45 @@ +/** + * 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.loader.kotlin.dsl + +import org.apache.camel.builder.RouteBuilder +import org.apache.camel.model.rest.RestDefinition + +open class RestVerbConfiguration( + private val builder: RouteBuilder, + private val definition: RestDefinition) { + + constructor(builder: RouteBuilder, path: String): this(builder, builder.rest(path)) + + fun get(path: String, block: RestDefinition.() -> Unit) = definition.get(path).block() + fun get(block: RestDefinition.() -> Unit) = definition.get().block() + + fun post(path: String, block: RestDefinition.() -> Unit) = definition.post(path).block() + fun post(block: RestDefinition.() -> Unit) = definition.post().block() + + fun delete(path: String, block: RestDefinition.() -> Unit) = definition.delete(path).block() + fun delete(block: RestDefinition.() -> Unit) = definition.delete().block() + + fun head(path: String, block: RestDefinition.() -> Unit) = definition.head(path).block() + fun head(block: RestDefinition.() -> Unit) = definition.head().block() + + fun put(path: String, block: RestDefinition.() -> Unit) = definition.put(path).block() + fun put(block: RestDefinition.() -> Unit) = definition.put().block() + + fun patch(path: String, block: RestDefinition.() -> Unit) = definition.patch(path).block() + fun patch(block: RestDefinition.() -> Unit) = definition.patch().block() +} \ No newline at end of file diff --git a/camel-k-loader-kotlin/src/test/kotlin/org/apache/camel/k/loader/kotlin/dsl/IntegrationTest.kt b/camel-k-loader-kotlin/src/test/kotlin/org/apache/camel/k/loader/kotlin/dsl/IntegrationTest.kt index 8f274e0..9f14169 100644 --- a/camel-k-loader-kotlin/src/test/kotlin/org/apache/camel/k/loader/kotlin/dsl/IntegrationTest.kt +++ b/camel-k-loader-kotlin/src/test/kotlin/org/apache/camel/k/loader/kotlin/dsl/IntegrationTest.kt @@ -24,6 +24,8 @@ import org.apache.camel.impl.DefaultCamelContext import org.apache.camel.k.Runtime import org.apache.camel.k.listener.RoutesConfigurer.forRoutes import org.apache.camel.model.ModelCamelContext +import org.apache.camel.model.rest.GetVerbDefinition +import org.apache.camel.model.rest.PostVerbDefinition import org.apache.camel.processor.FatalFallbackErrorHandler import org.apache.camel.support.DefaultHeaderFilterStrategy import org.assertj.core.api.Assertions.assertThat @@ -42,8 +44,29 @@ class IntegrationTest { assertThat(context.restConfiguration.port).isEqualTo(9192) assertThat(context.getRestConfiguration("undertow", false).host).isEqualTo("my-undertow-host") assertThat(context.getRestConfiguration("undertow", false).port).isEqualTo(9193) - assertThat(context.adapt(ModelCamelContext::class.java).restDefinitions.size).isEqualTo(1) - assertThat(context.adapt(ModelCamelContext::class.java).restDefinitions[0].path).isEqualTo("/my/path") + assertThat(context.adapt(ModelCamelContext::class.java).restDefinitions.size).isEqualTo(2) + + with(context.adapt(ModelCamelContext::class.java).restDefinitions.find { it.path == "/my/path" }) { + assertThat(this?.verbs).hasSize(1) + + with(this?.verbs?.get(0) as GetVerbDefinition) { + assertThat(uri).isEqualTo("/get") + assertThat(consumes).isEqualTo("application/json") + assertThat(produces).isEqualTo("application/json") + assertThat(to).hasFieldOrPropertyWithValue("endpointUri", "direct:get") + } + } + + with(context.adapt(ModelCamelContext::class.java).restDefinitions.find { it.path == "/post" }) { + assertThat(this?.verbs).hasSize(1) + + with(this?.verbs?.get(0) as PostVerbDefinition) { + assertThat(uri).isNull() + assertThat(consumes).isEqualTo("application/json") + assertThat(produces).isEqualTo("application/json") + assertThat(to).hasFieldOrPropertyWithValue("endpointUri", "direct:post") + } + } } @Test diff --git a/camel-k-loader-kotlin/src/test/resources/routes-with-rest.kts b/camel-k-loader-kotlin/src/test/resources/routes-with-rest.kts index 81ffe86..8d4d82e 100644 --- a/camel-k-loader-kotlin/src/test/resources/routes-with-rest.kts +++ b/camel-k-loader-kotlin/src/test/resources/routes-with-rest.kts @@ -11,6 +11,18 @@ rest { } path("/my/path") { + get("/get") { + consumes("application/json") + produces("application/json") + to("direct:get") + } + } + + post { + path("/post") + consumes("application/json") + produces("application/json") + to("direct:post") } }