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>