From 344af95cb5ff7dd9b05502ff46a44605a493ab1a Mon Sep 17 00:00:00 2001 From: lburgazzoli Date: Fri, 15 Feb 2019 16:54:01 +0100 Subject: [PATCH] Error while deploying integration in Knative based environment #436 --- pkg/trait/knative_service.go | 2 ++ pkg/trait/knative_test.go | 4 ++-- .../main/java/org/apache/camel/k/Source.java | 22 ++++++++++++++++--- .../camel/k/jvm/loader/JavaClassLoader.java | 10 ++++----- .../camel/k/jvm/loader/JavaSourceLoader.java | 12 +++++----- .../apache/camel/k/jvm/RoutesLoadersTest.java | 17 ++++++++++++++ .../resources/MyRoutesWithNameOverride.java | 9 ++++++++ 7 files changed, 59 insertions(+), 17 deletions(-) create mode 100644 runtime/camel-k-runtime-jvm/src/test/resources/MyRoutesWithNameOverride.java diff --git a/pkg/trait/knative_service.go b/pkg/trait/knative_service.go index 28f2613a8a..6dc03f8665 100644 --- a/pkg/trait/knative_service.go +++ b/pkg/trait/knative_service.go @@ -140,6 +140,8 @@ func (t *knativeServiceTrait) getServiceFor(e *Environment) (*serving.Service, e envvar.SetVal(&environment, envName, s.Content) params := make([]string, 0) + params = append(params, "name="+s.Name) + if s.InferLanguage() != "" { params = append(params, "language="+string(s.InferLanguage())) } diff --git a/pkg/trait/knative_test.go b/pkg/trait/knative_test.go index 55838b41ca..fcb8a48320 100644 --- a/pkg/trait/knative_test.go +++ b/pkg/trait/knative_test.go @@ -111,7 +111,7 @@ func TestKnativeTraitWithCompressedSources(t *testing.T) { routes := util.LookupEnvVar(vars, "CAMEL_K_ROUTES") assert.NotNil(t, routes) - assert.Equal(t, "env:CAMEL_K_ROUTE_000?language=js&compression=true", routes.Value) + assert.Equal(t, "env:CAMEL_K_ROUTE_000?name=routes.js&language=js&compression=true", routes.Value) route := util.LookupEnvVar(vars, "CAMEL_K_ROUTE_000") assert.NotNil(t, route) @@ -209,7 +209,7 @@ func TestKnativeTraitWithConfigMapSources(t *testing.T) { routes := util.LookupEnvVar(vars, "CAMEL_K_ROUTES") assert.NotNil(t, routes) - assert.Equal(t, "env:CAMEL_K_ROUTE_000?language=js&compression=true", routes.Value) + assert.Equal(t, "env:CAMEL_K_ROUTE_000?name=routes.js&language=js&compression=true", routes.Value) route := util.LookupEnvVar(vars, "CAMEL_K_ROUTE_000") assert.NotNil(t, route) diff --git a/runtime/camel-k-runtime-core/src/main/java/org/apache/camel/k/Source.java b/runtime/camel-k-runtime-core/src/main/java/org/apache/camel/k/Source.java index b777109564..ccedd65d51 100644 --- a/runtime/camel-k-runtime-core/src/main/java/org/apache/camel/k/Source.java +++ b/runtime/camel-k-runtime-core/src/main/java/org/apache/camel/k/Source.java @@ -23,16 +23,22 @@ import org.apache.commons.lang3.StringUtils; public class Source { + private final String name; private final String location; private final String language; private final boolean compressed; - private Source(String location, String language, boolean compression) { + private Source(String name, String location, String language, boolean compression) { + this.name = name; this.location = location; this.language = language; this.compressed = compression; } + public String getName() { + return name; + } + public String getLocation() { return location; } @@ -66,7 +72,8 @@ public static Source create(String uri) throws Exception { final String query = StringUtils.substringAfter(uri, "?"); final Map params = URISupport.parseQuery(query); final String languageName = (String) params.get("language"); - final boolean compression = Boolean.valueOf((String) params.get("compression")); + final String compression = (String) params.get("compression"); + String language = languageName; if (ObjectHelper.isEmpty(language)) { @@ -77,7 +84,16 @@ public static Source create(String uri) throws Exception { throw new IllegalArgumentException("Unknown language " + language); } + String name = (String) params.get("name"); + if (name == null) { + name = StringUtils.substringAfter(location, ":"); + name = StringUtils.substringBeforeLast(name, "."); + + if (name.contains("/")) { + name = StringUtils.substringAfterLast(name, "/"); + } + } - return new Source(location, language, compression); + return new Source(name, location, language, Boolean.valueOf(compression)); } } diff --git a/runtime/camel-k-runtime-jvm/src/main/java/org/apache/camel/k/jvm/loader/JavaClassLoader.java b/runtime/camel-k-runtime-jvm/src/main/java/org/apache/camel/k/jvm/loader/JavaClassLoader.java index eb2a2f5b46..eb400ba181 100644 --- a/runtime/camel-k-runtime-jvm/src/main/java/org/apache/camel/k/jvm/loader/JavaClassLoader.java +++ b/runtime/camel-k-runtime-jvm/src/main/java/org/apache/camel/k/jvm/loader/JavaClassLoader.java @@ -20,7 +20,6 @@ import java.util.List; import org.apache.camel.builder.RouteBuilder; -import org.apache.camel.k.Constants; import org.apache.camel.k.RoutesLoader; import org.apache.camel.k.Runtime; import org.apache.camel.k.Source; @@ -34,14 +33,13 @@ public List getSupportedLanguages() { @Override public RouteBuilder load(Runtime.Registry registry, Source source) throws Exception { - String path = source.getLocation(); - path = StringUtils.removeStart(path, Constants.SCHEME_CLASSPATH); - path = StringUtils.removeEnd(path, ".class"); + String name = source.getName(); + name = StringUtils.removeEnd(name, ".class"); - Class type = Class.forName(path); + Class type = Class.forName(name); if (!RouteBuilder.class.isAssignableFrom(type)) { - throw new IllegalStateException("The class provided (" + path + ") is not a org.apache.camel.builder.RouteBuilder"); + throw new IllegalStateException("The class provided (" + source.getLocation() + ") is not a org.apache.camel.builder.RouteBuilder"); } return (RouteBuilder)type.newInstance(); diff --git a/runtime/camel-k-runtime-jvm/src/main/java/org/apache/camel/k/jvm/loader/JavaSourceLoader.java b/runtime/camel-k-runtime-jvm/src/main/java/org/apache/camel/k/jvm/loader/JavaSourceLoader.java index 8a333b760e..35fb2f496a 100644 --- a/runtime/camel-k-runtime-jvm/src/main/java/org/apache/camel/k/jvm/loader/JavaSourceLoader.java +++ b/runtime/camel-k-runtime-jvm/src/main/java/org/apache/camel/k/jvm/loader/JavaSourceLoader.java @@ -49,15 +49,15 @@ public void configure() throws Exception { final CamelContext context = getContext(); try (InputStream is = URIResolver.resolve(context, source)) { - String name = source.getLocation(); - name = StringUtils.substringAfter(name, ":"); + String name = source.getName(); name = StringUtils.removeEnd(name, ".java"); - if (name.contains("/")) { - name = StringUtils.substringAfterLast(name, "/"); - } + // compile the source in memory + String content = IOUtils.toString(is, StandardCharsets.UTF_8); + Reflect compiled = Reflect.compile(name, content); - RoutesBuilder builder = Reflect.compile(name, IOUtils.toString(is, StandardCharsets.UTF_8)).create().get(); + // create the builder + RoutesBuilder builder = compiled.create().get(); // Wrap routes builder includeRoutes(builder); diff --git a/runtime/camel-k-runtime-jvm/src/test/java/org/apache/camel/k/jvm/RoutesLoadersTest.java b/runtime/camel-k-runtime-jvm/src/test/java/org/apache/camel/k/jvm/RoutesLoadersTest.java index 5a8eea8b35..9a01f69436 100644 --- a/runtime/camel-k-runtime-jvm/src/test/java/org/apache/camel/k/jvm/RoutesLoadersTest.java +++ b/runtime/camel-k-runtime-jvm/src/test/java/org/apache/camel/k/jvm/RoutesLoadersTest.java @@ -88,6 +88,23 @@ public void testLoadJava() throws Exception { assertThat(routes.get(0).getOutputs().get(0)).isInstanceOf(ToDefinition.class); } + @Test + public void testLoadJavaWithNameOverride() throws Exception { + Source source = Source.create("classpath:MyRoutesWithNameOverride.java?name=MyRoutes.java"); + RoutesLoader loader = RuntimeSupport.loaderFor(new DefaultCamelContext(), source); + RouteBuilder builder = loader.load(new InMemoryRegistry(), source); + + assertThat(loader).isInstanceOf(JavaSourceLoader.class); + assertThat(builder).isNotNull(); + + builder.configure(); + + List 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 public void testLoadJavaWithNestedClass() throws Exception { Source source = Source.create("classpath:MyRoutesWithNestedClass.java"); diff --git a/runtime/camel-k-runtime-jvm/src/test/resources/MyRoutesWithNameOverride.java b/runtime/camel-k-runtime-jvm/src/test/resources/MyRoutesWithNameOverride.java new file mode 100644 index 0000000000..217d80c1c4 --- /dev/null +++ b/runtime/camel-k-runtime-jvm/src/test/resources/MyRoutesWithNameOverride.java @@ -0,0 +1,9 @@ +import org.apache.camel.builder.RouteBuilder; + +public class MyRoutes extends RouteBuilder { + @Override + public void configure() throws Exception { + from("timer:tick") + .to("log:info"); + } +} \ No newline at end of file