Repository: camel
Updated Branches:
  refs/heads/master 73202b3d7 -> 93041ad60


CAMEL-7208: Updating routes from managed camel context should support decoding 
the xml prior to loading the routes, as the xml may likely have been xml 
encoded. Added 2nd option with boolean to turn on|off.


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

Branch: refs/heads/master
Commit: 93041ad60c94e87b2454eb7508737a91a426eae9
Parents: 73202b3
Author: Claus Ibsen <davscl...@apache.org>
Authored: Sat Feb 15 12:45:35 2014 +0100
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Sat Feb 15 12:57:52 2014 +0100

----------------------------------------------------------------------
 .../mbean/ManagedCamelContextMBean.java         |   3 +
 .../management/mbean/ManagedCamelContext.java   |  13 +-
 ...tesWithPropertyPlaceholdersFromXmlPTest.java | 161 +++++++++++++++++++
 3 files changed, 176 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/93041ad6/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedCamelContextMBean.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedCamelContextMBean.java
 
b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedCamelContextMBean.java
index 15bd452..fb9cdc2 100644
--- 
a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedCamelContextMBean.java
+++ 
b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedCamelContextMBean.java
@@ -170,6 +170,9 @@ public interface ManagedCamelContextMBean extends 
ManagedPerformanceCounterMBean
     @ManagedOperation(description = "Adds or updates existing routes from XML")
     void addOrUpdateRoutesFromXml(String xml) throws Exception;
 
+    @ManagedOperation(description = "Adds or updates existing routes from XML")
+    void addOrUpdateRoutesFromXml(String xml, boolean urlDecode) throws 
Exception;
+
     @ManagedOperation(description = "Dumps the routes stats as XML")
     String dumpRoutesStatsAsXml(boolean fullStats, boolean includeProcessors) 
throws Exception;
 

http://git-wip-us.apache.org/repos/asf/camel/blob/93041ad6/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java
 
b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java
index 1e2d6d4..5217ef9 100644
--- 
a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java
+++ 
b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java
@@ -18,6 +18,7 @@ package org.apache.camel.management.mbean;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.URLDecoder;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.LinkedHashSet;
@@ -46,6 +47,7 @@ import org.apache.camel.model.ModelCamelContext;
 import org.apache.camel.model.ModelHelper;
 import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.model.RoutesDefinition;
+import org.apache.camel.util.URISupport;
 
 /**
  * @version 
@@ -292,7 +294,16 @@ public class ManagedCamelContext extends 
ManagedPerformanceCounter implements Ti
     }
 
     public void addOrUpdateRoutesFromXml(String xml) throws Exception {
-        // convert to model from xml
+        // do not decode so we function as before
+        addOrUpdateRoutesFromXml(xml, false);
+    }
+
+    public void addOrUpdateRoutesFromXml(String xml, boolean urlDecode) throws 
Exception {
+        // decode String as it may have been encoded, from its xml source
+        if (urlDecode) {
+            xml = URLDecoder.decode(xml, "UTF-8");
+        }
+
         InputStream is = 
context.getTypeConverter().mandatoryConvertTo(InputStream.class, xml);
         RoutesDefinition def = context.loadRoutesDefinition(is);
         if (def == null) {

http://git-wip-us.apache.org/repos/asf/camel/blob/93041ad6/camel-core/src/test/java/org/apache/camel/management/ManagedCamelContextUpdateRoutesWithPropertyPlaceholdersFromXmlPTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/management/ManagedCamelContextUpdateRoutesWithPropertyPlaceholdersFromXmlPTest.java
 
b/camel-core/src/test/java/org/apache/camel/management/ManagedCamelContextUpdateRoutesWithPropertyPlaceholdersFromXmlPTest.java
new file mode 100644
index 0000000..1c98684
--- /dev/null
+++ 
b/camel-core/src/test/java/org/apache/camel/management/ManagedCamelContextUpdateRoutesWithPropertyPlaceholdersFromXmlPTest.java
@@ -0,0 +1,161 @@
+/**
+ * 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.management;
+
+import java.util.Properties;
+import java.util.Set;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.component.properties.PropertiesComponent;
+
+/**
+ * @version 
+ */
+public class 
ManagedCamelContextUpdateRoutesWithPropertyPlaceholdersFromXmlPTest extends 
ManagementTestSupport {
+
+    private Properties props;
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        props = new Properties();
+        props.put("somewhere", "mock:changed");
+        props.put("theBar", "mock:bar");
+
+        CamelContext context = super.createCamelContext();
+
+        PropertiesComponent pc = context.getComponent("properties", 
PropertiesComponent.class);
+        pc.setLocations(new String[0]);
+        pc.setOverrideProperties(props);
+
+        return context;
+    }
+
+    public void testUpdate() throws Exception {
+        // JMX tests dont work well on AIX CI servers (hangs them)
+        if (isPlatform("aix")) {
+            return;
+        }
+
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedBodiesReceived("Hello World");
+        template.sendBody("direct:start", "Hello World");
+        assertMockEndpointsSatisfied();
+
+        MBeanServer mbeanServer = getMBeanServer();
+
+        // there should be 1 routes to start with
+        Set<ObjectName> set = mbeanServer.queryNames(new 
ObjectName("*:type=routes,*"), null);
+        assertEquals(1, set.size());
+
+        // update existing route, and add a 2nd
+        String xml =
+                  "<routes id=\"myRoute\" 
xmlns=\"http://camel.apache.org/schema/spring\";>"
+                + "<route id=\"myRoute\">"
+                + "  <from uri=\"direct:start\"/>"
+                + "  <log message=\"This is a changed route saying ${body}\"/>"
+                + "  <to uri=\"{{somewhere}}\"/>"
+                + "</route>"
+                + "<route id=\"myOtherRoute\">"
+                + "  <from uri=\"seda:bar\"/>"
+                + "  <to uri=\"{{theBar}}\"/>"
+                + "</route>"
+                + "</routes>";
+
+        ObjectName on = 
ObjectName.getInstance("org.apache.camel:context=camel-1,type=context,name=\"camel-1\"");
+        mbeanServer.invoke(on, "addOrUpdateRoutesFromXml", new Object[]{xml}, 
new String[]{"java.lang.String"});
+
+        // there should be 2 routes now
+        set = mbeanServer.queryNames(new ObjectName("*:type=routes,*"), null);
+        assertEquals(2, set.size());
+
+        // test updated route
+        getMockEndpoint("mock:changed").expectedMessageCount(1);
+        template.sendBody("direct:start", "Bye World");
+        assertMockEndpointsSatisfied();
+
+        // test new route
+        getMockEndpoint("mock:bar").expectedMessageCount(1);
+        template.sendBody("seda:bar", "Hi Camel");
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testUpdateEscaped() throws Exception {
+        // JMX tests dont work well on AIX CI servers (hangs them)
+        if (isPlatform("aix")) {
+            return;
+        }
+
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedBodiesReceived("Hello World");
+        template.sendBody("direct:start", "Hello World");
+        assertMockEndpointsSatisfied();
+
+        MBeanServer mbeanServer = getMBeanServer();
+
+        // there should be 1 routes to start with
+        Set<ObjectName> set = mbeanServer.queryNames(new 
ObjectName("*:type=routes,*"), null);
+        assertEquals(1, set.size());
+
+        // update existing route, and add a 2nd
+        String xml =
+                  "<routes id=\"myRoute\" 
xmlns=\"http://camel.apache.org/schema/spring\";>"
+                + "<route id=\"myRoute\">"
+                + "  <from uri=\"direct:start\"/>"
+                + "  <log message=\"This is a changed route saying ${body}\"/>"
+                + "  <to uri=\"%7B%7Bsomewhere%7D%7D\"/>"
+                + "</route>"
+                + "<route id=\"myOtherRoute\">"
+                + "  <from uri=\"seda:bar\"/>"
+                + "  <to uri=\"%7B%7BtheBar%7D%7D\"/>"
+                + "</route>"
+                + "</routes>";
+
+        ObjectName on = 
ObjectName.getInstance("org.apache.camel:context=camel-1,type=context,name=\"camel-1\"");
+        mbeanServer.invoke(on, "addOrUpdateRoutesFromXml", new Object[]{xml, 
true}, new String[]{"java.lang.String", "boolean"});
+
+        // there should be 2 routes now
+        set = mbeanServer.queryNames(new ObjectName("*:type=routes,*"), null);
+        assertEquals(2, set.size());
+
+        // test updated route
+        getMockEndpoint("mock:changed").expectedMessageCount(1);
+        template.sendBody("direct:start", "Bye World");
+        assertMockEndpointsSatisfied();
+
+        // test new route
+        getMockEndpoint("mock:bar").expectedMessageCount(1);
+        template.sendBody("seda:bar", "Hi Camel");
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start").routeId("myRoute")
+                    .log("Got ${body}")
+                    .to("mock:result");
+            }
+        };
+    }
+
+}

Reply via email to