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..c287dce 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, System.getProperty("org.moqui.camel.routes.package")); + 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); + } + } }