This is an automated email from the ASF dual-hosted git repository. nferraro pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel-k.git
commit ddeca452aa6045178f116da04f4d65e2f7db5147 Author: lburgazzoli <lburgazz...@gmail.com> AuthorDate: Tue Oct 9 23:37:16 2018 +0200 runtime(kotlin) : switch to kotlin 1.3 scripting --- runtime/examples/kotlin-routes.kts | 4 +- runtime/kotlin/pom.xml | 33 +++++++- .../apache/camel/k/kotlin/KotlinRoutesLoader.kt | 90 +++++++++++++--------- .../camel/k/kotlin/dsl/IntegrationConfiguration.kt | 54 +++++++++++++ .../kotlin/org/apache/camel/k/kotlin/LoaderTest.kt | 1 - .../apache/camel/k/kotlin/dsl/IntegrationTest.kt | 13 ++-- .../camel/k/kotlin/extension/LogExtensionTest.kt | 1 - runtime/kotlin/src/test/resources/log4j2-test.xml | 8 +- runtime/kotlin/src/test/resources/routes-new.kts | 2 + runtime/pom.xml | 30 +++++++- 10 files changed, 175 insertions(+), 61 deletions(-) diff --git a/runtime/examples/kotlin-routes.kts b/runtime/examples/kotlin-routes.kts index 8c49d44..8b15930 100644 --- a/runtime/examples/kotlin-routes.kts +++ b/runtime/examples/kotlin-routes.kts @@ -15,6 +15,6 @@ from("timer:kotlin?period=1s") .setBody() .constant("Hello Camel K!") .process().message { - m -> m.headers["RandomValue"] = rnd.nextInt() + it.headers["RandomValue"] = rnd.nextInt() } - .to("log:info?showHeaders=true") \ No newline at end of file + .to("log:info?showAll=true&multiline=true") \ No newline at end of file diff --git a/runtime/kotlin/pom.xml b/runtime/kotlin/pom.xml index 9589d96..0c0f706 100644 --- a/runtime/kotlin/pom.xml +++ b/runtime/kotlin/pom.xml @@ -47,7 +47,12 @@ </dependency> <dependency> <groupId>org.jetbrains.kotlin</groupId> - <artifactId>kotlin-compiler-embeddable</artifactId> + <artifactId>kotlin-scripting-jvm</artifactId> + <version>${kotlin.version}</version> + </dependency> + <dependency> + <groupId>org.jetbrains.kotlin</groupId> + <artifactId>kotlin-scripting-jvm-host</artifactId> <version>${kotlin.version}</version> </dependency> @@ -60,10 +65,17 @@ <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> - <version>${junit-juniper.version}</version> + <version>${junit-jupiter.version}</version> <scope>test</scope> </dependency> <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter-engine</artifactId> + <version>${junit-jupiter.version}</version> + <scope>test</scope> + </dependency> + + <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> <version>${assertj.version}</version> @@ -82,14 +94,27 @@ <executions> <execution> <id>compile</id> - <goals> <goal>compile</goal> </goals> + <goals> + <goal>compile</goal> + </goals> </execution> <execution> <id>test-compile</id> - <goals> <goal>test-compile</goal> </goals> + <goals> + <goal>test-compile</goal> + </goals> </execution> </executions> </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <version>${maven-surefire-plugin.version}</version> + <configuration> + <useSystemClassLoader>false</useSystemClassLoader> + <forkCount>0</forkCount> + </configuration> + </plugin> </plugins> </build> diff --git a/runtime/kotlin/src/main/kotlin/org/apache/camel/k/kotlin/KotlinRoutesLoader.kt b/runtime/kotlin/src/main/kotlin/org/apache/camel/k/kotlin/KotlinRoutesLoader.kt index 609f9c5..9551e95 100644 --- a/runtime/kotlin/src/main/kotlin/org/apache/camel/k/kotlin/KotlinRoutesLoader.kt +++ b/runtime/kotlin/src/main/kotlin/org/apache/camel/k/kotlin/KotlinRoutesLoader.kt @@ -20,12 +20,25 @@ import org.apache.camel.builder.RouteBuilder import org.apache.camel.k.jvm.Language import org.apache.camel.k.jvm.RoutesLoader import org.apache.camel.k.jvm.RuntimeRegistry +import org.apache.camel.k.kotlin.dsl.IntegrationConfiguration import org.apache.camel.util.ResourceHelper +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import java.io.File import java.io.InputStreamReader -import javax.script.ScriptEngineManager -import javax.script.SimpleBindings +import kotlin.script.experimental.api.* +import kotlin.script.experimental.host.toScriptSource +import kotlin.script.experimental.jvm.dependenciesFromClassloader +import kotlin.script.experimental.jvm.javaHome +import kotlin.script.experimental.jvm.jvm +import kotlin.script.experimental.jvmhost.BasicJvmScriptEvaluator +import kotlin.script.experimental.jvmhost.BasicJvmScriptingHost +import kotlin.script.experimental.jvmhost.JvmScriptCompiler class KotlinRoutesLoader : RoutesLoader { + companion object { + val LOGGER : Logger = LoggerFactory.getLogger(KotlinRoutesLoader::class.java) + } override fun getSupportedLanguages(): List<Language> { return listOf(Language.Kotlin) @@ -36,49 +49,50 @@ class KotlinRoutesLoader : RoutesLoader { return object : RouteBuilder() { @Throws(Exception::class) override fun configure() { - val context = context - val manager = ScriptEngineManager() - val engine = manager.getEngineByExtension("kts") - val bindings = SimpleBindings() + val builder = this + val compiler = JvmScriptCompiler() + val evaluator = BasicJvmScriptEvaluator() + val host = BasicJvmScriptingHost(compiler = compiler, evaluator = evaluator) + val javaHome = System.getenv("KOTLIN_JDK_HOME") ?: "/usr/lib/jvm/java" - bindings["builder"] = this - bindings["registry"] = registry - bindings["context"] = context + LOGGER.info("JAVA_HOME is set to {}", javaHome) ResourceHelper.resolveMandatoryResourceAsInputStream(context, resource).use { `is` -> - val pre = """ - val builder = bindings["builder"] as org.apache.camel.builder.RouteBuilder - - fun rest(block: org.apache.camel.k.kotlin.dsl.RestConfiguration.() -> Unit) { - val delegate = org.apache.camel.k.kotlin.dsl.RestConfiguration(builder) - delegate.block() - } - - fun context(block: org.apache.camel.k.kotlin.dsl.ContextConfiguration.() -> Unit) { - val delegate = org.apache.camel.k.kotlin.dsl.ContextConfiguration( - context = bindings["context"] as org.apache.camel.CamelContext, - registry = bindings["registry"] as org.apache.camel.k.jvm.RuntimeRegistry - ) - - delegate.block() - } - - fun from(uri: String): org.apache.camel.model.RouteDefinition = builder.from(uri) + val result = host.eval( + InputStreamReader(`is`).readText().toScriptSource(), + ScriptCompilationConfiguration { + baseClass(IntegrationConfiguration::class) + jvm { + // + // This is needed as workaround for: + // https://youtrack.jetbrains.com/issue/KT-27497 + // + javaHome(File(javaHome)) - fun processor(fn: (org.apache.camel.Exchange) -> Unit) : org.apache.camel.Processor { - return object: org.apache.camel.Processor { - override fun process(exchange: org.apache.camel.Exchange) = fn(exchange) + // + // The Kotlin script compiler does not inherit + // the classpath by default + // + dependenciesFromClassloader(wholeClasspath = true) } + }, + ScriptEvaluationConfiguration { + // + // Arguments used to initialize the script base class + // + constructorArgs(registry, builder) } - fun predicate(fn: (org.apache.camel.Exchange) -> Boolean) : org.apache.camel.Predicate { - return object: org.apache.camel.Predicate { - override fun matches(exchange: org.apache.camel.Exchange) : Boolean = fn(exchange) - } - } - """.trimIndent() + ) - engine.eval(pre, bindings) - engine.eval(InputStreamReader(`is`), bindings) + for (report in result.reports) { + if (report.severity == ScriptDiagnostic.Severity.ERROR) { + LOGGER.error("{}", report.message, report.exception) + } else if (report.severity == ScriptDiagnostic.Severity.WARNING) { + LOGGER.warn("{}", report.message, report.exception) + } else { + LOGGER.info("{}", report.message) + } + } } } } diff --git a/runtime/kotlin/src/main/kotlin/org/apache/camel/k/kotlin/dsl/IntegrationConfiguration.kt b/runtime/kotlin/src/main/kotlin/org/apache/camel/k/kotlin/dsl/IntegrationConfiguration.kt new file mode 100644 index 0000000..52d20f4 --- /dev/null +++ b/runtime/kotlin/src/main/kotlin/org/apache/camel/k/kotlin/dsl/IntegrationConfiguration.kt @@ -0,0 +1,54 @@ +/** + * 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.kotlin.dsl + +import org.apache.camel.Exchange +import org.apache.camel.Predicate +import org.apache.camel.Processor +import org.apache.camel.builder.RouteBuilder +import org.apache.camel.k.jvm.RuntimeRegistry +import org.apache.camel.model.RouteDefinition + +abstract class IntegrationConfiguration( + private val registry : RuntimeRegistry, + private val builder : RouteBuilder) { + + fun rest(block: RestConfiguration.() -> Unit) { + val delegate = RestConfiguration(builder) + delegate.block() + } + + fun context(block: ContextConfiguration.() -> Unit) { + val delegate = ContextConfiguration( + context = builder.context, + registry = registry + ) + + delegate.block() + } + + fun from(uri: String): RouteDefinition { + return builder.from(uri) + } + + fun processor(fn: (Exchange) -> Unit) : Processor { + return Processor { exchange -> fn(exchange) } + } + fun predicate(fn: (Exchange) -> Boolean) : Predicate { + return Predicate { exchange -> fn(exchange) } + } +} \ No newline at end of file diff --git a/runtime/kotlin/src/test/kotlin/org/apache/camel/k/kotlin/LoaderTest.kt b/runtime/kotlin/src/test/kotlin/org/apache/camel/k/kotlin/LoaderTest.kt index 7d38bb3..da4ab18 100644 --- a/runtime/kotlin/src/test/kotlin/org/apache/camel/k/kotlin/LoaderTest.kt +++ b/runtime/kotlin/src/test/kotlin/org/apache/camel/k/kotlin/LoaderTest.kt @@ -26,7 +26,6 @@ import org.junit.jupiter.api.Test class LoaderTest { @Test - @Throws(Exception::class) fun `load route from classpath`() { val resource = "classpath:routes.kts" val loader = RoutesLoaders.loaderFor(resource, null) diff --git a/runtime/kotlin/src/test/kotlin/org/apache/camel/k/kotlin/dsl/IntegrationTest.kt b/runtime/kotlin/src/test/kotlin/org/apache/camel/k/kotlin/dsl/IntegrationTest.kt index 62f485f..734f278 100644 --- a/runtime/kotlin/src/test/kotlin/org/apache/camel/k/kotlin/dsl/IntegrationTest.kt +++ b/runtime/kotlin/src/test/kotlin/org/apache/camel/k/kotlin/dsl/IntegrationTest.kt @@ -13,7 +13,6 @@ import java.util.concurrent.atomic.AtomicReference class IntegrationTest { @Test - @Throws(Exception::class) fun `load integration with rest`() { var runtime = org.apache.camel.k.jvm.Runtime() runtime.duration = 5 @@ -35,7 +34,6 @@ class IntegrationTest { } @Test - @Throws(Exception::class) fun `load integration with binding`() { var runtime = org.apache.camel.k.jvm.Runtime() runtime.duration = 5 @@ -48,12 +46,11 @@ class IntegrationTest { runtime.run() - assertThat(runtime.camelContext.registry.lookup("my-entry")).isEqualTo("myRegistryEntry1") - assertThat(runtime.camelContext.registry.lookup("my-proc")).isInstanceOf(Processor::class.java) + assertThat(runtime.camelContext.registry.lookupByName("my-entry")).isEqualTo("myRegistryEntry1") + assertThat(runtime.camelContext.registry.lookupByName("my-proc")).isInstanceOf(Processor::class.java) } @Test - @Throws(Exception::class) fun `load integration with component configuration`() { val sedaSize = AtomicInteger() val sedaConsumers = AtomicInteger() @@ -71,9 +68,9 @@ class IntegrationTest { val log = runtime.camelContext.getComponent("log", LogComponent::class.java) sedaSize.set(seda!!.queueSize) - sedaConsumers.set(seda!!.concurrentConsumers) + sedaConsumers.set(seda.concurrentConsumers) mySedaSize.set(mySeda!!.queueSize) - mySedaConsumers.set(mySeda!!.concurrentConsumers) + mySedaConsumers.set(mySeda.concurrentConsumers) format.set(log!!.exchangeFormatter) main.stop() @@ -86,6 +83,6 @@ class IntegrationTest { assertThat(sedaConsumers.get()).isEqualTo(12) assertThat(mySedaSize.get()).isEqualTo(4321) assertThat(mySedaConsumers.get()).isEqualTo(21) - assertThat(format.get()).isNotNull() + assertThat(format.get()).isNotNull } } \ No newline at end of file diff --git a/runtime/kotlin/src/test/kotlin/org/apache/camel/k/kotlin/extension/LogExtensionTest.kt b/runtime/kotlin/src/test/kotlin/org/apache/camel/k/kotlin/extension/LogExtensionTest.kt index d3be5de..9d9a328 100644 --- a/runtime/kotlin/src/test/kotlin/org/apache/camel/k/kotlin/extension/LogExtensionTest.kt +++ b/runtime/kotlin/src/test/kotlin/org/apache/camel/k/kotlin/extension/LogExtensionTest.kt @@ -8,7 +8,6 @@ import org.junit.jupiter.api.Test class LogExtensionTest { @Test - @Throws(Exception::class) fun `invoke extension method - formatter`() { val ctx = DefaultCamelContext() diff --git a/runtime/kotlin/src/test/resources/log4j2-test.xml b/runtime/kotlin/src/test/resources/log4j2-test.xml index 84eda6d..a505fd9 100644 --- a/runtime/kotlin/src/test/resources/log4j2-test.xml +++ b/runtime/kotlin/src/test/resources/log4j2-test.xml @@ -4,15 +4,13 @@ <Console name="STDOUT" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS}|%-5level|%t|%c{1} - %msg%n"/> </Console> - <File name="FILE" fileName="target/camel-k-runtime-kotlin-test.log"> - <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS}|%-5level|%t|%c{1} - %msg%n"/> - </File> + <Null name="NONE"/> </Appenders> <Loggers> <Root level="INFO"> - <!--<AppenderRef ref="STDOUT"/>--> - <AppenderRef ref="FILE"/> + <!-- <AppenderRef ref="STDOUT"/> --> + <AppenderRef ref="NONE"/> </Root> </Loggers> diff --git a/runtime/kotlin/src/test/resources/routes-new.kts b/runtime/kotlin/src/test/resources/routes-new.kts new file mode 100644 index 0000000..af6ac29 --- /dev/null +++ b/runtime/kotlin/src/test/resources/routes-new.kts @@ -0,0 +1,2 @@ + +println("test") \ No newline at end of file diff --git a/runtime/pom.xml b/runtime/pom.xml index 2748ccd..10bc293 100644 --- a/runtime/pom.xml +++ b/runtime/pom.xml @@ -35,7 +35,7 @@ <camel.version>2.22.1</camel.version> <junit.version>4.12</junit.version> - <junit-juniper.version>5.3.1</junit-juniper.version> + <junit-jupiter.version>5.3.1</junit-jupiter.version> <joor.version>0.9.9</joor.version> <commons-io.version>2.6</commons-io.version> <commons-lang.version>3.8.1</commons-lang.version> @@ -43,13 +43,14 @@ <log4j2.version>2.11.1</log4j2.version> <slf4j.version>1.7.25</slf4j.version> <groovy.version>2.4.15</groovy.version> - <kotlin.version>1.2.71</kotlin.version> + <kotlin.version>1.3.0-rc-198</kotlin.version> <snakeyaml.version>1.23</snakeyaml.version> <spock.version>1.0-groovy-2.4</spock.version> <gmavenplus-plugin.version>1.6.1</gmavenplus-plugin.version> <fabric8-maven-plugin.version>3.5.40</fabric8-maven-plugin.version> <maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version> + <maven-surefire-plugin.version>2.22.1</maven-surefire-plugin.version> </properties> <dependencyManagement> @@ -84,4 +85,29 @@ <module>dependency-lister</module> </modules> + <!-- ************************** --> + <!-- kotlin 1.3 --> + <!-- ************************** --> + + <repositories> + <repository> + <snapshots> + <enabled>false</enabled> + </snapshots> + <id>bintray-kotlin-maven</id> + <name>bintray</name> + <url>https://dl.bintray.com/kotlin/kotlin-eap</url> + </repository> + </repositories> + <pluginRepositories> + <pluginRepository> + <snapshots> + <enabled>false</enabled> + </snapshots> + <id>bintray-kotlin-maven</id> + <name>bintray-plugins</name> + <url>https://dl.bintray.com/kotlin/kotlin-eap</url> + </pluginRepository> + </pluginRepositories> + </project>