You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2016/12/19 15:35:18 UTC

[6/8] camel git commit: CAMEL-10599: Add ReloadStrategy to allow watching for file changes and reload routes on the fly.

CAMEL-10599: Add ReloadStrategy to allow watching for file changes and reload routes on the fly.


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/fbbf8299
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/fbbf8299
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/fbbf8299

Branch: refs/heads/master
Commit: fbbf82997a8a40e706b539455daa4549e8eda92e
Parents: 2131527
Author: Claus Ibsen <da...@apache.org>
Authored: Mon Dec 19 14:51:37 2016 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Mon Dec 19 16:34:46 2016 +0100

----------------------------------------------------------------------
 .../org/apache/camel/model/ModelHelper.java     | 27 ++++++++-----
 .../camel/support/ReloadStrategySupport.java    | 42 +++++++++++++++-----
 .../resources/META-INF/spring/camel-context.xml |  4 +-
 3 files changed, 51 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/fbbf8299/camel-core/src/main/java/org/apache/camel/model/ModelHelper.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/model/ModelHelper.java b/camel-core/src/main/java/org/apache/camel/model/ModelHelper.java
index db40f63..871bdad 100644
--- a/camel-core/src/main/java/org/apache/camel/model/ModelHelper.java
+++ b/camel-core/src/main/java/org/apache/camel/model/ModelHelper.java
@@ -30,11 +30,6 @@ import javax.xml.bind.Marshaller;
 import javax.xml.transform.OutputKeys;
 import javax.xml.transform.TransformerException;
 
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
 import org.apache.camel.CamelContext;
 import org.apache.camel.Expression;
 import org.apache.camel.NamedNode;
@@ -44,6 +39,10 @@ import org.apache.camel.model.language.ExpressionDefinition;
 import org.apache.camel.spi.NamespaceAware;
 import org.apache.camel.spi.TypeConverterRegistry;
 import org.apache.camel.util.ObjectHelper;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
 
 import static org.apache.camel.model.ProcessorDefinitionHelper.filterTypeInOutputs;
 
@@ -144,16 +143,26 @@ public final class ModelHelper {
      * @throws Exception is thrown if an error is encountered unmarshalling from xml to model
      */
     public static RoutesDefinition loadRoutesDefinition(CamelContext context, InputStream inputStream) throws Exception {
-        JAXBContext jaxbContext = getJAXBContext(context);
-
         XmlConverter xmlConverter = newXmlConverter(context);
         Document dom = xmlConverter.toDOMDocument(inputStream, null);
+        return loadRoutesDefinition(context, dom);
+    }
+
+    /**
+     * Marshal the xml to the model definition
+     *
+     * @param context the CamelContext, if <tt>null</tt> then {@link org.apache.camel.spi.ModelJAXBContextFactory} is not in use
+     * @param node the xml node
+     * @throws Exception is thrown if an error is encountered unmarshalling from xml to model
+     */
+    public static RoutesDefinition loadRoutesDefinition(CamelContext context, Node node) throws Exception {
+        JAXBContext jaxbContext = getJAXBContext(context);
 
         Map<String, String> namespaces = new LinkedHashMap<>();
-        extractNamespaces(dom, namespaces);
+        extractNamespaces(node.getOwnerDocument(), namespaces);
 
         Binder<Node> binder = jaxbContext.createBinder();
-        Object result = binder.unmarshal(dom);
+        Object result = binder.unmarshal(node);
 
         if (result == null) {
             throw new JAXBException("Cannot unmarshal to RoutesDefinition using JAXB");

http://git-wip-us.apache.org/repos/asf/camel/blob/fbbf8299/camel-core/src/main/java/org/apache/camel/support/ReloadStrategySupport.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/support/ReloadStrategySupport.java b/camel-core/src/main/java/org/apache/camel/support/ReloadStrategySupport.java
index e0957d7..7dbc14b 100644
--- a/camel-core/src/main/java/org/apache/camel/support/ReloadStrategySupport.java
+++ b/camel-core/src/main/java/org/apache/camel/support/ReloadStrategySupport.java
@@ -19,12 +19,16 @@ package org.apache.camel.support;
 import java.io.InputStream;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.model.ModelHelper;
 import org.apache.camel.model.RoutesDefinition;
 import org.apache.camel.spi.ReloadStrategy;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.ServiceHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
 
 /**
  * Base class for implementing custom {@link ReloadStrategy} SPI plugins.
@@ -63,21 +67,37 @@ public abstract class ReloadStrategySupport extends ServiceSupport implements Re
 
     @Override
     public void onReloadRoutes(CamelContext camelContext, String name, InputStream resource) {
-
-        // load the stream in as DOM and find out if its <routes> <route> or <camelContext>
-        // and if its <blueprint> <beans> etc and then find inside the <camelContext> and grab what we support re-loading
-
         log.debug("Reloading CamelContext: {} routes from resource: {}", camelContext.getName(), name);
-        // assume the resource is XML routes
-        try {
-            RoutesDefinition routes = camelContext.loadRoutesDefinition(resource);
-            camelContext.addRouteDefinitions(routes.getRoutes());
-        } catch (Exception e) {
+
+        Document dom = camelContext.getTypeConverter().tryConvertTo(Document.class, resource);
+        if (dom == null) {
             failed++;
-            throw ObjectHelper.wrapRuntimeCamelException(e);
+            log.warn("Cannot load the resource " + name + " as XML");
+            return;
         }
-        log.info("Reloaded CamelContext: {} routes from resource: {}", camelContext.getName(), name);
 
+        // find the <routes> root
+        NodeList list = dom.getElementsByTagName("routes");
+        if (list == null || list.getLength() == 0) {
+            // fallback to <route>
+            list = dom.getElementsByTagName("route");
+        }
+
+        if (list != null && list.getLength() > 0) {
+            for (int i = 0; i < list.getLength(); i++) {
+                Node node = list.item(i);
+                try {
+                    RoutesDefinition routes = ModelHelper.loadRoutesDefinition(camelContext, node);
+                    camelContext.addRouteDefinitions(routes.getRoutes());
+                } catch (Exception e) {
+                    failed++;
+                    throw ObjectHelper.wrapRuntimeCamelException(e);
+                }
+
+            }
+        }
+
+        log.info("Reloaded CamelContext: {} routes from resource: {}", camelContext.getName(), name);
         succeeded++;
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/fbbf8299/examples/camel-example-reload/src/main/resources/META-INF/spring/camel-context.xml
----------------------------------------------------------------------
diff --git a/examples/camel-example-reload/src/main/resources/META-INF/spring/camel-context.xml b/examples/camel-example-reload/src/main/resources/META-INF/spring/camel-context.xml
index ec81cc1..f6df299 100644
--- a/examples/camel-example-reload/src/main/resources/META-INF/spring/camel-context.xml
+++ b/examples/camel-example-reload/src/main/resources/META-INF/spring/camel-context.xml
@@ -23,13 +23,13 @@
        http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
 
   <camelContext xmlns="http://camel.apache.org/schema/spring">
-    <route>
+    <route id="myRoute">
       <from uri="timer:foo"/>
       <!-- try to change me and save this file -->
       <transform>
         <constant>Hello World</constant>
       </transform>
-      <to uri="log:out"/>
+      <log message="You said: ${body}"/>
     </route>
   </camelContext>