From d24e7ca368915459fa5ba9226e86e3f75311b28d Mon Sep 17 00:00:00 2001 From: Girish Vasmatkar Date: Sun, 25 Aug 2019 21:39:37 +0530 Subject: [PATCH 1/2] Enable auto-discovery of camel routes defined in a configured package. --- MoquiConf.xml | 1 + data/demoData.json | 5 +++ .../moqui/camel/routes/MoquiDemoRoute.java | 39 ++++++++++++++++ .../service/camel/CamelToolFactory.groovy | 45 +++++++++++++++++++ 4 files changed, 90 insertions(+) create mode 100644 data/demoData.json create mode 100644 src/main/groovy/org/moqui/camel/routes/MoquiDemoRoute.java diff --git a/MoquiConf.xml b/MoquiConf.xml index bce5c69..2621af2 100644 --- a/MoquiConf.xml +++ b/MoquiConf.xml @@ -2,6 +2,7 @@ + diff --git a/data/demoData.json b/data/demoData.json new file mode 100644 index 0000000..fa72b90 --- /dev/null +++ b/data/demoData.json @@ -0,0 +1,5 @@ +{ + "testInput": "foo bar", + "authUsername": "john.doe", + "authPassword": "moqui" +} \ No newline at end of file diff --git a/src/main/groovy/org/moqui/camel/routes/MoquiDemoRoute.java b/src/main/groovy/org/moqui/camel/routes/MoquiDemoRoute.java new file mode 100644 index 0000000..c6e02d4 --- /dev/null +++ b/src/main/groovy/org/moqui/camel/routes/MoquiDemoRoute.java @@ -0,0 +1,39 @@ +/* + * This software is in the public domain under CC0 1.0 Universal plus a + * Grant of Patent License. + * + * To the extent possible under law, the author(s) have dedicated all + * copyright and related and neighboring rights to this software to the + * public domain worldwide. This software is distributed without any + * warranty. + * + * You should have received a copy of the CC0 Public Domain Dedication + * along with this software (see the LICENSE.md file). If not, see + * . + */ +package org.moqui.camel.routes; + +import java.util.HashMap; +import java.util.Map; +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class MoquiDemoRoute extends RouteBuilder { + + @Override + public void configure() throws Exception { + from("file://runtime/component/moqui-camel/data?fileName=demoData.json&noop=true") + .convertBodyTo(String.class) + .process(new Processor() { + @Override @SuppressWarnings("unchecked") + public void process(Exchange exchange) throws Exception { + String body = exchange.getIn().getBody(String.class); + Map bodyMap = new ObjectMapper().readValue(body, HashMap.class); + exchange.getOut().setBody(bodyMap, Map.class); + } + }) + .to("moquiservice://moqui.example.ExampleServices.targetCamelExample"); + } +} \ No newline at end of file diff --git a/src/main/groovy/org/moqui/impl/service/camel/CamelToolFactory.groovy b/src/main/groovy/org/moqui/impl/service/camel/CamelToolFactory.groovy index 44b2b4a..fe4f5e6 100644 --- a/src/main/groovy/org/moqui/impl/service/camel/CamelToolFactory.groovy +++ b/src/main/groovy/org/moqui/impl/service/camel/CamelToolFactory.groovy @@ -16,6 +16,9 @@ package org.moqui.impl.service.camel import groovy.transform.CompileStatic import org.apache.camel.CamelContext import org.apache.camel.impl.DefaultCamelContext +import org.apache.camel.builder.RouteBuilder +import org.apache.camel.impl.DefaultPackageScanClassResolver +import org.apache.camel.spi.PackageScanClassResolver import org.moqui.context.ExecutionContextFactory import org.moqui.context.ToolFactory import org.slf4j.Logger @@ -44,6 +47,7 @@ class CamelToolFactory implements ToolFactory { logger.info("Starting Camel") moquiServiceComponent = new MoquiServiceComponent(this) camelContext.addComponent("moquiservice", moquiServiceComponent) + if(System.getProperty("org.moqui.camel.routes.package"))loadRoutes() camelContext.start() } @Override @@ -69,4 +73,45 @@ class CamelToolFactory implements ToolFactory { MoquiServiceComponent getMoquiServiceComponent() { return moquiServiceComponent } void registerCamelConsumer(String uri, MoquiServiceConsumer consumer) { camelConsumerByUriMap.put(uri, consumer) } MoquiServiceConsumer getCamelConsumer(String uri) { return camelConsumerByUriMap.get(uri) } + + + /** + * Auto load camel routes + */ + private void loadRoutes(){ + logger.info("Loading routes...") + PackageScanClassResolver packageResolver = new DefaultPackageScanClassResolver() + Set> routesClassesSet = packageResolver.findImplementations(RouteBuilder.class, "org.moqui.camel.routes"); + routesClassesSet.each{key -> + RouteBuilder routeBuilder = createRoutes(key.getName()); + addRoutesToContext(routeBuilder); + } + } + + /** + * Loads {@code routeBuilderCls} to add into CamelContext + * @param routeBuilderCls + * @return + */ + private RouteBuilder createRoutes(String routeBuilderCls) { + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + try { + Class c = loader.loadClass(routeBuilderCls); + return (RouteBuilder) c.newInstance(); + } catch (Exception e) { + logger.error("Error in loading routeBuilderCls "+routeBuilderCls, e) + } + } + + /** + * Adds {@code routeBuilder} to the CamelContext + * @param routeBuilder + */ + private void addRoutesToContext(RouteBuilder routeBuilder) { + try { + camelContext.addRoutes(routeBuilder); + } catch (Exception e) { + logger.error("Cannot add routes to : " + routeBuilder, e); + } + } } From fd905fe02e401d94ade8ab9831219747437c6d90 Mon Sep 17 00:00:00 2001 From: Girish Vasmatkar Date: Mon, 26 Aug 2019 07:10:09 +0530 Subject: [PATCH 2/2] Corrected code to use system property instead of constant --- .../groovy/org/moqui/impl/service/camel/CamelToolFactory.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/groovy/org/moqui/impl/service/camel/CamelToolFactory.groovy b/src/main/groovy/org/moqui/impl/service/camel/CamelToolFactory.groovy index fe4f5e6..c287dce 100644 --- a/src/main/groovy/org/moqui/impl/service/camel/CamelToolFactory.groovy +++ b/src/main/groovy/org/moqui/impl/service/camel/CamelToolFactory.groovy @@ -81,7 +81,7 @@ class CamelToolFactory implements ToolFactory { private void loadRoutes(){ logger.info("Loading routes...") PackageScanClassResolver packageResolver = new DefaultPackageScanClassResolver() - Set> routesClassesSet = packageResolver.findImplementations(RouteBuilder.class, "org.moqui.camel.routes"); + Set> routesClassesSet = packageResolver.findImplementations(RouteBuilder.class, System.getProperty("org.moqui.camel.routes.package")); routesClassesSet.each{key -> RouteBuilder routeBuilder = createRoutes(key.getName()); addRoutesToContext(routeBuilder);