You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by nf...@apache.org on 2018/09/11 08:45:23 UTC
[camel-k] branch master updated: runtime: add support for groovy
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
The following commit(s) were added to refs/heads/master by this push:
new 9851138 runtime: add support for groovy
9851138 is described below
commit 9851138be93901e74f225f8da561e0ed0b83316a
Author: lburgazzoli <lb...@gmail.com>
AuthorDate: Tue Sep 11 10:39:22 2018 +0200
runtime: add support for groovy
---
runtime/jvm/pom.xml | 6 ++
.../java/org/apache/camel/k/jvm/RouteLoaders.java | 73 +++++++++++++++++++---
.../org/apache/camel/k/jvm/RouteLoadersTest.java | 21 ++++++-
runtime/jvm/src/test/resources/routes.groovy | 3 +
runtime/pom.xml | 1 +
5 files changed, 94 insertions(+), 10 deletions(-)
diff --git a/runtime/jvm/pom.xml b/runtime/jvm/pom.xml
index 678a468..1aeb457 100644
--- a/runtime/jvm/pom.xml
+++ b/runtime/jvm/pom.xml
@@ -41,6 +41,12 @@
<artifactId>commons-lang3</artifactId>
<version>${commons-lang.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.codehaus.groovy</groupId>
+ <artifactId>groovy</artifactId>
+ <version>${groovy.version}</version>
+ <optional>true</optional>
+ </dependency>
<dependency>
<groupId>junit</groupId>
diff --git a/runtime/jvm/src/main/java/org/apache/camel/k/jvm/RouteLoaders.java b/runtime/jvm/src/main/java/org/apache/camel/k/jvm/RouteLoaders.java
index c5b5b99..77cd3bc 100644
--- a/runtime/jvm/src/main/java/org/apache/camel/k/jvm/RouteLoaders.java
+++ b/runtime/jvm/src/main/java/org/apache/camel/k/jvm/RouteLoaders.java
@@ -19,6 +19,7 @@ package org.apache.camel.k.jvm;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
+import java.io.Reader;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.function.Function;
@@ -27,20 +28,23 @@ import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.SimpleBindings;
+import groovy.lang.Binding;
+import groovy.lang.GroovyShell;
+import groovy.util.DelegatingScript;
import org.apache.camel.CamelContext;
import org.apache.camel.Component;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.model.RouteDefinition;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
+import org.codehaus.groovy.control.CompilerConfiguration;
import org.joor.Reflect;
public enum RouteLoaders implements RoutesLoader {
JavaClass {
@Override
public boolean test(String resource) {
- return !resource.endsWith(".java") && !resource.endsWith(".js")
- && (resource.startsWith(Application.SCHEME_CLASSPATH) || resource.startsWith(Application.SCHEME_FILE));
+ return !isScripting(resource) && hasSupportedScheme(resource);
}
@Override
@@ -58,8 +62,7 @@ public enum RouteLoaders implements RoutesLoader {
JavaSource {
@Override
public boolean test(String resource) {
- return resource.endsWith(".java")
- && (resource.startsWith(Application.SCHEME_CLASSPATH) || resource.startsWith(Application.SCHEME_FILE));
+ return isScripting(resource, "java") && hasSupportedScheme(resource);
}
@Override
@@ -76,8 +79,7 @@ public enum RouteLoaders implements RoutesLoader {
JavaScript {
@Override
public boolean test(String resource) {
- return resource.endsWith(".js")
- && (resource.startsWith(Application.SCHEME_CLASSPATH) || resource.startsWith(Application.SCHEME_FILE));
+ return isScripting(resource, "js") && hasSupportedScheme(resource);
}
@Override
@@ -102,8 +104,36 @@ public enum RouteLoaders implements RoutesLoader {
}
};
}
- };
+ },
+ Groovy {
+ @Override
+ public boolean test(String resource) {
+ return isScripting(resource, "groovy") && hasSupportedScheme(resource);
+ }
+
+ @Override
+ public RouteBuilder load(String resource) throws Exception {
+ return new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ CompilerConfiguration cc = new CompilerConfiguration();
+ cc.setScriptBaseClass(DelegatingScript.class.getName());
+
+ ClassLoader cl = Thread.currentThread().getContextClassLoader();
+ GroovyShell sh = new GroovyShell(cl, new Binding(), cc);
+ try (InputStream is = is(resource)) {
+ Reader reader = new InputStreamReader(is);
+ DelegatingScript script = (DelegatingScript) sh.parse(reader);
+
+ // set the delegate target
+ script.setDelegate(new ScriptingDsl(this));
+ script.run();
+ }
+ }
+ };
+ }
+ };
// ********************************
//
@@ -112,6 +142,18 @@ public enum RouteLoaders implements RoutesLoader {
// TODO: move to a dedicate class
// ********************************
+ public static boolean isScripting(String resource, String type) {
+ return type.startsWith(".") ? resource.endsWith(type) : resource.endsWith("." + type);
+ }
+
+ public static boolean isScripting(String resource) {
+ return resource.endsWith(".java") || resource.endsWith(".js") || resource.endsWith(".groovy");
+ }
+
+ public static boolean hasSupportedScheme(String resource) {
+ return resource.startsWith(Application.SCHEME_CLASSPATH) || resource.startsWith(Application.SCHEME_FILE);
+ }
+
public static RoutesLoader loaderFor(String resource) {
for (RoutesLoader loader: RouteLoaders.values()) {
if (loader.test(resource)) {
@@ -160,4 +202,21 @@ public enum RouteLoaders implements RoutesLoader {
return instance;
}
}
+
+ private static class ScriptingDsl {
+ private final RouteBuilder builder;
+
+ public final CamelContext context;
+ public final Components components;
+
+ public ScriptingDsl(RouteBuilder builder) {
+ this.builder = builder;
+ this.context = builder.getContext();
+ this.components = new Components(builder.getContext());
+ }
+
+ public RouteDefinition from(String endpoint) {
+ return builder.from(endpoint);
+ }
+ }
}
diff --git a/runtime/jvm/src/test/java/org/apache/camel/k/jvm/RouteLoadersTest.java b/runtime/jvm/src/test/java/org/apache/camel/k/jvm/RouteLoadersTest.java
index f9cf4c7..4dcea3b 100644
--- a/runtime/jvm/src/test/java/org/apache/camel/k/jvm/RouteLoadersTest.java
+++ b/runtime/jvm/src/test/java/org/apache/camel/k/jvm/RouteLoadersTest.java
@@ -42,7 +42,6 @@ public class RouteLoadersTest {
assertThat(routes).hasSize(1);
assertThat(routes.get(0).getInputs().get(0).getEndpointUri()).isEqualTo("timer:tick");
assertThat(routes.get(0).getOutputs().get(0)).isInstanceOf(ToDefinition.class);
- assertThat(routes.get(0).getOutputs().get(0)).isInstanceOf(ToDefinition.class);
}
@Test
@@ -60,11 +59,10 @@ public class RouteLoadersTest {
assertThat(routes).hasSize(1);
assertThat(routes.get(0).getInputs().get(0).getEndpointUri()).isEqualTo("timer:tick");
assertThat(routes.get(0).getOutputs().get(0)).isInstanceOf(ToDefinition.class);
- assertThat(routes.get(0).getOutputs().get(0)).isInstanceOf(ToDefinition.class);
}
@Test
- public void testLoadScript() throws Exception {
+ public void testLoadJavaScript() throws Exception {
String resource = "classpath:/routes.js";
RoutesLoader loader = RouteLoaders.loaderFor(resource);
RouteBuilder builder = loader.load(resource);
@@ -80,6 +78,23 @@ public class RouteLoadersTest {
assertThat(routes.get(0).getOutputs().get(0)).isInstanceOf(ToDefinition.class);
}
+ @Test
+ public void testLoadGroovy() throws Exception {
+ String resource = "classpath:/routes.groovy";
+ RoutesLoader loader = RouteLoaders.loaderFor(resource);
+ RouteBuilder builder = loader.load(resource);
+
+ assertThat(loader).isSameAs(RouteLoaders.Groovy);
+ assertThat(builder).isNotNull();
+
+ builder.configure();
+
+ List<RouteDefinition> routes = builder.getRouteCollection().getRoutes();
+ assertThat(routes).hasSize(1);
+ assertThat(routes.get(0).getInputs().get(0).getEndpointUri()).isEqualTo("timer:tick");
+ assertThat(routes.get(0).getOutputs().get(0)).isInstanceOf(ToDefinition.class);
+ }
+
@Test(expected = IllegalArgumentException.class)
public void testResourceWithoutScheme() {
RouteLoaders.loaderFor("routes.js");
diff --git a/runtime/jvm/src/test/resources/routes.groovy b/runtime/jvm/src/test/resources/routes.groovy
new file mode 100644
index 0000000..0f5600d
--- /dev/null
+++ b/runtime/jvm/src/test/resources/routes.groovy
@@ -0,0 +1,3 @@
+
+from('timer:tick')
+ .to('log:info')
\ No newline at end of file
diff --git a/runtime/pom.xml b/runtime/pom.xml
index 8cba9f5..bcef12e 100644
--- a/runtime/pom.xml
+++ b/runtime/pom.xml
@@ -23,6 +23,7 @@
<assertj.version>3.11.1</assertj.version>
<log4j2.version>2.11.0</log4j2.version>
<slf4j.version>1.7.25</slf4j.version>
+ <groovy.version>2.5.2</groovy.version>
<fabric8-maven-plugin.version>3.5.40</fabric8-maven-plugin.version>
</properties>