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 82967d2 chore(runtime): try to lookup routes loaders from registry first, then from resources/services 82967d2 is described below commit 82967d22ed75cafce5e93371d6db478d9e2c7037 Author: lburgazzoli <lburgazz...@gmail.com> AuthorDate: Sun Dec 16 16:31:04 2018 +0100 chore(runtime): try to lookup routes loaders from registry first, then from resources/services --- .../src/main/java/org/apache/camel/k/Language.java | 2 +- .../main/java/org/apache/camel/k/RuntimeTrait.java | 7 +- .../src/main/java/org/apache/camel/k/Source.java | 2 +- .../org/apache/camel/k/groovy/LoaderTest.groovy | 4 +- .../main/java/org/apache/camel/k/jvm/Runtime.java | 69 +++++++++++++++++- .../org/apache/camel/k/jvm/RuntimeSupport.java | 7 ++ .../apache/camel/k/jvm/SimpleRuntimeRegistry.java | 82 ---------------------- .../org/apache/camel/k/jvm/RoutesLoadersTest.java | 28 ++++++-- .../kotlin/org/apache/camel/k/kotlin/LoaderTest.kt | 6 +- 9 files changed, 106 insertions(+), 101 deletions(-) diff --git a/runtime/camel-k-runtime-core/src/main/java/org/apache/camel/k/Language.java b/runtime/camel-k-runtime-core/src/main/java/org/apache/camel/k/Language.java index c338bd6..1f7f9a3 100644 --- a/runtime/camel-k-runtime-core/src/main/java/org/apache/camel/k/Language.java +++ b/runtime/camel-k-runtime-core/src/main/java/org/apache/camel/k/Language.java @@ -85,7 +85,7 @@ public enum Language { return Unknown; } - public static Language fromResource(String resource) { + public static Language fromLocation(String resource) { for (Language language: values()) { String path = StringUtils.substringAfter(resource, ":"); diff --git a/runtime/camel-k-runtime-core/src/main/java/org/apache/camel/k/RuntimeTrait.java b/runtime/camel-k-runtime-core/src/main/java/org/apache/camel/k/RuntimeTrait.java index 275f53a..2bc7868 100644 --- a/runtime/camel-k-runtime-core/src/main/java/org/apache/camel/k/RuntimeTrait.java +++ b/runtime/camel-k-runtime-core/src/main/java/org/apache/camel/k/RuntimeTrait.java @@ -1,7 +1,3 @@ -package org.apache.camel.k; - -import org.apache.camel.CamelContext; - /** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -18,6 +14,9 @@ import org.apache.camel.CamelContext; * See the License for the specific language governing permissions and * limitations under the License. */ +package org.apache.camel.k; + +import org.apache.camel.CamelContext; @FunctionalInterface public interface RuntimeTrait { 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 0726b07..12b2d1b 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 @@ -70,7 +70,7 @@ public class Source { Language language = ObjectHelper.isNotEmpty(languageName) ? Language.fromLanguageName(languageName) - : Language.fromResource(location); + : Language.fromLocation(location); return new Source(location, language, compression); } diff --git a/runtime/camel-k-runtime-groovy/src/test/groovy/org/apache/camel/k/groovy/LoaderTest.groovy b/runtime/camel-k-runtime-groovy/src/test/groovy/org/apache/camel/k/groovy/LoaderTest.groovy index 0bc194f..87ce859 100644 --- a/runtime/camel-k-runtime-groovy/src/test/groovy/org/apache/camel/k/groovy/LoaderTest.groovy +++ b/runtime/camel-k-runtime-groovy/src/test/groovy/org/apache/camel/k/groovy/LoaderTest.groovy @@ -17,8 +17,8 @@ package org.apache.camel.k.groovy import org.apache.camel.impl.DefaultCamelContext +import org.apache.camel.k.jvm.Runtime import org.apache.camel.k.jvm.RuntimeSupport -import org.apache.camel.k.jvm.SimpleRuntimeRegistry import org.apache.camel.k.Source import org.apache.camel.model.ToDefinition import spock.lang.Specification @@ -31,7 +31,7 @@ class LoaderTest extends Specification { when: def loader = RuntimeSupport.loaderFor(new DefaultCamelContext(), source) - def builder = loader.load(new SimpleRuntimeRegistry(), source) + def builder = loader.load(new Runtime.Registry(), source) then: loader instanceof GroovyRoutesLoader diff --git a/runtime/camel-k-runtime-jvm/src/main/java/org/apache/camel/k/jvm/Runtime.java b/runtime/camel-k-runtime-jvm/src/main/java/org/apache/camel/k/jvm/Runtime.java index 3923e85..4d5adb5 100644 --- a/runtime/camel-k-runtime-jvm/src/main/java/org/apache/camel/k/jvm/Runtime.java +++ b/runtime/camel-k-runtime-jvm/src/main/java/org/apache/camel/k/jvm/Runtime.java @@ -16,12 +16,16 @@ */ package org.apache.camel.k.jvm; +import java.util.HashMap; import java.util.Map; import java.util.Properties; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import java.util.stream.Collectors; import org.apache.camel.CamelContext; +import org.apache.camel.NoSuchBeanException; import org.apache.camel.ProducerTemplate; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.properties.PropertiesComponent; @@ -38,10 +42,11 @@ public final class Runtime extends MainSupport { private static final Logger LOGGER = LoggerFactory.getLogger(Runtime.class); private final ConcurrentMap<String, CamelContext> contextMap; - private final RuntimeRegistry registry = new SimpleRuntimeRegistry(); + private final RuntimeRegistry registry; public Runtime() { this.contextMap = new ConcurrentHashMap<>(); + this.registry = new Registry(); } public void load(String[] routes) throws Exception { @@ -121,4 +126,66 @@ public final class Runtime extends MainSupport { getCamelContexts().get(0).stop(); } } + + // ******************************** + // + // Registry + // + // ******************************** + + public static final class Registry implements RuntimeRegistry { + private final ConcurrentMap<String, Object> registry; + + public Registry() { + this.registry = new ConcurrentHashMap<>(); + } + + public void bind(String name, Object bean) { + this.registry.put(name, bean); + } + + @Override + public Object lookupByName(String name) { + return registry.get(name); + } + + @Override + public <T> T lookupByNameAndType(String name, Class<T> type) { + final Object answer = lookupByName(name); + + if (answer != null) { + try { + return type.cast(answer); + } catch (Throwable t) { + throw new NoSuchBeanException( + name, + "Found bean: " + name + " in RuntimeRegistry: " + this + " of type: " + answer.getClass().getName() + " expected type was: " + type, + t + ); + } + } + + return null; + } + + @Override + public <T> Map<String, T> findByTypeWithName(Class<T> type) { + final Map<String, T> result = new HashMap<>(); + + registry.entrySet().stream() + .filter(entry -> type.isInstance(entry.getValue())) + .forEach(entry -> result.put(entry.getKey(), type.cast(entry.getValue()))); + + return result; + } + + @Override + public <T> Set<T> findByType(Class<T> type) { + return registry.values().stream() + .filter(type::isInstance) + .map(type::cast) + .collect(Collectors.toSet()); + } + } + } diff --git a/runtime/camel-k-runtime-jvm/src/main/java/org/apache/camel/k/jvm/RuntimeSupport.java b/runtime/camel-k-runtime-jvm/src/main/java/org/apache/camel/k/jvm/RuntimeSupport.java index b3192b6..700d70d 100644 --- a/runtime/camel-k-runtime-jvm/src/main/java/org/apache/camel/k/jvm/RuntimeSupport.java +++ b/runtime/camel-k-runtime-jvm/src/main/java/org/apache/camel/k/jvm/RuntimeSupport.java @@ -184,6 +184,13 @@ public final class RuntimeSupport { } public static RoutesLoader loaderFor(CamelContext context, Source source) { + return context.getRegistry().findByType(RoutesLoader.class).stream() + .filter(rl -> rl.getSupportedLanguages().contains(source.getLanguage())) + .findFirst() + .orElseGet(() -> lookupLoaderFromResource(context, source)); + } + + public static RoutesLoader lookupLoaderFromResource(CamelContext context, Source source) { final FactoryFinder finder; final RoutesLoader loader; diff --git a/runtime/camel-k-runtime-jvm/src/main/java/org/apache/camel/k/jvm/SimpleRuntimeRegistry.java b/runtime/camel-k-runtime-jvm/src/main/java/org/apache/camel/k/jvm/SimpleRuntimeRegistry.java deleted file mode 100644 index c62175f..0000000 --- a/runtime/camel-k-runtime-jvm/src/main/java/org/apache/camel/k/jvm/SimpleRuntimeRegistry.java +++ /dev/null @@ -1,82 +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.jvm; - -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import java.util.stream.Collectors; - -import org.apache.camel.NoSuchBeanException; -import org.apache.camel.k.RuntimeRegistry; - -public class SimpleRuntimeRegistry implements RuntimeRegistry { - private final ConcurrentMap<String, Object> registry; - - public SimpleRuntimeRegistry() { - this.registry = new ConcurrentHashMap<>(); - } - - public void bind(String name, Object bean) { - this.registry.put(name, bean); - } - - @Override - public Object lookupByName(String name) { - return registry.get(name); - } - - @Override - public <T> T lookupByNameAndType(String name, Class<T> type) { - final Object answer = lookupByName(name); - - if (answer != null) { - try { - return type.cast(answer); - } catch (Throwable t) { - throw new NoSuchBeanException( - name, - "Found bean: " + name + " in RuntimeRegistry: " + this + " of type: " + answer.getClass().getName() + " expected type was: " + type, - t - ); - } - } - - return null; - } - - @Override - public <T> Map<String, T> findByTypeWithName(Class<T> type) { - final Map<String, T> result = new HashMap<>(); - - registry.entrySet().stream() - .filter(entry -> type.isInstance(entry.getValue())) - .forEach(entry -> result.put(entry.getKey(), type.cast(entry.getValue()))); - - return result; - } - - @Override - public <T> Set<T> findByType(Class<T> type) { - return registry.values().stream() - .filter(type::isInstance) - .map(type::cast) - .collect(Collectors.toSet()); - } -} 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 cc3b7c3..88c29f9 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 @@ -21,6 +21,7 @@ import java.util.List; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.impl.DefaultCamelContext; import org.apache.camel.k.RoutesLoader; +import org.apache.camel.k.RuntimeRegistry; import org.apache.camel.k.Source; import org.apache.camel.k.jvm.loader.JavaClassLoader; import org.apache.camel.k.jvm.loader.JavaScriptLoader; @@ -38,10 +39,23 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThatExceptionOf public class RoutesLoadersTest { @Test + public void testLoaderFromRegistry() throws Exception { + RoutesLoader myLoader = new JavaClassLoader(); + RuntimeRegistry registry = new Runtime.Registry(); + registry.bind("my-loader", myLoader); + + Source source = Source.create("classpath:" + MyRoutes.class.getName() + ".class"); + RoutesLoader loader = RuntimeSupport.loaderFor(new DefaultCamelContext(registry), source); + + assertThat(loader).isInstanceOf(JavaClassLoader.class); + assertThat(loader).isSameAs(myLoader); + } + + @Test public void testLoadClass() throws Exception { Source source = Source.create("classpath:" + MyRoutes.class.getName() + ".class"); RoutesLoader loader = RuntimeSupport.loaderFor(new DefaultCamelContext(), source); - RouteBuilder builder = loader.load(new SimpleRuntimeRegistry(), source); + RouteBuilder builder = loader.load(new Runtime.Registry(), source); assertThat(loader).isInstanceOf(JavaClassLoader.class); assertThat(builder).isNotNull(); @@ -58,7 +72,7 @@ public class RoutesLoadersTest { public void testLoadJava() throws Exception { Source source = Source.create("classpath:MyRoutes.java"); RoutesLoader loader = RuntimeSupport.loaderFor(new DefaultCamelContext(), source); - RouteBuilder builder = loader.load(new SimpleRuntimeRegistry(), source); + RouteBuilder builder = loader.load(new Runtime.Registry(), source); assertThat(loader).isInstanceOf(JavaSourceLoader.class); assertThat(builder).isNotNull(); @@ -75,7 +89,7 @@ public class RoutesLoadersTest { public void testLoadJavaWithNestedClass() throws Exception { Source source = Source.create("classpath:MyRoutesWithNestedClass.java"); RoutesLoader loader = RuntimeSupport.loaderFor(new DefaultCamelContext(), source); - RouteBuilder builder = loader.load(new SimpleRuntimeRegistry(), source); + RouteBuilder builder = loader.load(new Runtime.Registry(), source); assertThat(loader).isInstanceOf(JavaSourceLoader.class); assertThat(builder).isNotNull(); @@ -94,7 +108,7 @@ public class RoutesLoadersTest { public void testLoadJavaScript() throws Exception { Source source = Source.create("classpath:routes.js"); RoutesLoader loader = RuntimeSupport.loaderFor(new DefaultCamelContext(), source); - RouteBuilder builder = loader.load(new SimpleRuntimeRegistry(), source); + RouteBuilder builder = loader.load(new Runtime.Registry(), source); assertThat(loader).isInstanceOf(JavaScriptLoader.class); assertThat(builder).isNotNull(); @@ -111,7 +125,7 @@ public class RoutesLoadersTest { public void testLoadCompressedRoute() throws Exception { Source source = Source.create("classpath:routes-compressed.js.gz.b64?language=js&compression=true"); RoutesLoader loader = RuntimeSupport.loaderFor(new DefaultCamelContext(), source); - RouteBuilder builder = loader.load(new SimpleRuntimeRegistry(), source); + RouteBuilder builder = loader.load(new Runtime.Registry(), source); assertThat(loader).isInstanceOf(JavaScriptLoader.class); assertThat(builder).isNotNull(); @@ -128,7 +142,7 @@ public class RoutesLoadersTest { public void testLoadJavaScriptWithCustomExtension() throws Exception { Source source = Source.create("classpath:routes.mytype?language=js"); RoutesLoader loader = RuntimeSupport.loaderFor(new DefaultCamelContext(), source); - RouteBuilder builder = loader.load(new SimpleRuntimeRegistry(), source); + RouteBuilder builder = loader.load(new Runtime.Registry(), source); assertThat(loader).isInstanceOf(JavaScriptLoader.class); assertThat(builder).isNotNull(); @@ -145,7 +159,7 @@ public class RoutesLoadersTest { public void testLoadXml() throws Exception { Source source = Source.create("classpath:routes.xml"); RoutesLoader loader = RuntimeSupport.loaderFor(new DefaultCamelContext(), source); - RouteBuilder builder = loader.load(new SimpleRuntimeRegistry(), source); + RouteBuilder builder = loader.load(new Runtime.Registry(), source); assertThat(loader).isInstanceOf(XmlLoader.class); assertThat(builder).isNotNull(); diff --git a/runtime/camel-k-runtime-kotlin/src/test/kotlin/org/apache/camel/k/kotlin/LoaderTest.kt b/runtime/camel-k-runtime-kotlin/src/test/kotlin/org/apache/camel/k/kotlin/LoaderTest.kt index c0f86c6..be4dced 100644 --- a/runtime/camel-k-runtime-kotlin/src/test/kotlin/org/apache/camel/k/kotlin/LoaderTest.kt +++ b/runtime/camel-k-runtime-kotlin/src/test/kotlin/org/apache/camel/k/kotlin/LoaderTest.kt @@ -18,8 +18,8 @@ package org.apache.camel.k.kotlin import org.apache.camel.impl.DefaultCamelContext import org.apache.camel.k.Source +import org.apache.camel.k.jvm.Runtime import org.apache.camel.k.jvm.RuntimeSupport -import org.apache.camel.k.jvm.SimpleRuntimeRegistry import org.apache.camel.model.ProcessDefinition import org.apache.camel.model.ToDefinition import org.assertj.core.api.Assertions.assertThat @@ -31,10 +31,10 @@ class LoaderTest { fun `load route from classpath`() { var source = Source.create("classpath:routes.kts") val loader = RuntimeSupport.loaderFor(DefaultCamelContext(), source) - val builder = loader.load(SimpleRuntimeRegistry(), source) + val builder = loader.load(Runtime.Registry(), source) assertThat(loader).isInstanceOf(KotlinRoutesLoader::class.java) - assertThat(builder).isNotNull() + assertThat(builder).isNotNull builder.configure()