This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch jmx-upd
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 68b21fe063dcd55e6acaf59f480e58710e514466
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Thu Dec 21 15:33:08 2023 +0100

    CAMEL-20274: camel-management - Add JMX operation to update route from XML
---
 .../catalog/main/camel-main-configuration-metadata.json |  1 +
 .../main/java/org/apache/camel/spi/ManagementAgent.java | 10 ++++++++++
 .../resources/org/apache/camel/core/xml/jmxAgent.json   |  3 ++-
 .../camel/core/xml/AbstractCamelContextFactoryBean.java |  4 ++++
 .../apache/camel/core/xml/CamelJMXAgentDefinition.java  | 17 +++++++++++++++++
 .../main/MainConfigurationPropertiesConfigurer.java     |  6 ++++++
 .../META-INF/camel-main-configuration-metadata.json     |  1 +
 core/camel-main/src/main/docs/main.adoc                 |  3 ++-
 .../camel/main/DefaultConfigurationConfigurer.java      |  2 ++
 .../camel/main/DefaultConfigurationProperties.java      | 15 +++++++++++++++
 .../camel/api/management/JmxSystemPropertyKeys.java     |  3 +++
 .../apache/camel/management/DefaultManagementAgent.java | 15 +++++++++++++++
 .../org/apache/camel/management/mbean/ManagedRoute.java |  6 ++++++
 .../management/DefaultManagementAgentMockTest.java      |  4 ++--
 .../management/ManagedRouteUpdateRouteFromXmlTest.java  | 11 +++++++++++
 dsl/camel-kamelet-main/src/main/docs/kamelet-main.adoc  |  1 +
 .../main/java/org/apache/camel/main/KameletMain.java    |  1 +
 17 files changed, 99 insertions(+), 4 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
index 3a1734b8152..23395908207 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
@@ -71,6 +71,7 @@
     { "name": "camel.main.jmxManagementMBeansLevel", "description": "Sets the 
mbeans registration level. The default value is Default.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "object", 
"javaType": "org.apache.camel.ManagementMBeansLevel", "defaultValue": "Default" 
},
     { "name": "camel.main.jmxManagementNamePattern", "description": "The 
naming pattern for creating the CamelContext JMX management name. The default 
pattern is #name#", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "string", 
"javaType": "java.lang.String", "defaultValue": "#name#" },
     { "name": "camel.main.jmxManagementStatisticsLevel", "description": "Sets 
the JMX statistics level, the level can be set to Extended to gather additional 
information The default value is Default.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "object", 
"javaType": "org.apache.camel.ManagementStatisticsLevel", "defaultValue": 
"Default", "enum": [ "Extended", "Default", "RoutesOnly", "Off" ] },
+    { "name": "camel.main.jmxUpdateRouteEnabled", "description": "Whether to 
allow updating routes at runtime via JMX using the ManagedRouteMBean. This is 
disabled by default, but can be enabled for development and troubleshooting 
purposes, such as updating routes in an existing running Camel via JMX and 
other tools.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", 
"javaType": "boolean", "defaultValue": "false" },
     { "name": "camel.main.lightweight", "description": "Configure the context 
to be lightweight. This will trigger some optimizations and memory reduction 
options. Lightweight context have some limitations. At this moment, dynamic 
endpoint destinations are not supported.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", 
"javaType": "boolean", "defaultValue": "false" },
     { "name": "camel.main.loadHealthChecks", "description": "Whether to load 
custom health checks by scanning classpath.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", 
"javaType": "boolean", "defaultValue": "false" },
     { "name": "camel.main.loadStatisticsEnabled", "description": "Sets whether 
context load statistics is enabled (something like the unix load average). The 
statistics requires to have camel-management on the classpath as JMX is 
required. The default value is false.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", 
"javaType": "boolean", "defaultValue": "false" },
diff --git 
a/core/camel-api/src/main/java/org/apache/camel/spi/ManagementAgent.java 
b/core/camel-api/src/main/java/org/apache/camel/spi/ManagementAgent.java
index 199ddb88fde..dba8ccd9057 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/ManagementAgent.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/ManagementAgent.java
@@ -326,4 +326,14 @@ public interface ManagementAgent extends Service {
      */
     void setUseHostIPAddress(Boolean useHostIPAddress);
 
+    /**
+     * Gets whether updating routes via JMX is allowed (is default disabled).
+     */
+    Boolean getUpdateRouteEnabled();
+
+    /**
+     * Sets whether updating routes via JMX is allowed (is default disabled).
+     */
+    void setUpdateRouteEnabled(Boolean updateRouteEnabled);
+
 }
diff --git 
a/core/camel-core-xml/src/generated/resources/org/apache/camel/core/xml/jmxAgent.json
 
b/core/camel-core-xml/src/generated/resources/org/apache/camel/core/xml/jmxAgent.json
index 7077f5b6774..d5af413f381 100644
--- 
a/core/camel-core-xml/src/generated/resources/org/apache/camel/core/xml/jmxAgent.json
+++ 
b/core/camel-core-xml/src/generated/resources/org/apache/camel/core/xml/jmxAgent.json
@@ -26,6 +26,7 @@
     "endpointRuntimeStatisticsEnabled": { "index": 11, "kind": "attribute", 
"displayName": "Endpoint Runtime Statistics Enabled", "required": false, 
"type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": "A 
flag that indicates whether endpoint runtime statistics is enabled" },
     "includeHostName": { "index": 12, "kind": "attribute", "displayName": 
"Include Host Name", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "A flag that indicates whether to include 
hostname in JMX MBean names." },
     "useHostIPAddress": { "index": 13, "kind": "attribute", "displayName": 
"Use Host IPAddress", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "A flag that indicates whether to use 
hostname or IP Address in the service url." },
-    "mask": { "index": 14, "kind": "attribute", "displayName": "Mask", 
"required": false, "type": "boolean", "javaType": "java.lang.Boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": true, 
"description": "A flag that indicates whether to remove detected sensitive 
information (such as passwords) from MBean names and attributes." }
+    "mask": { "index": 14, "kind": "attribute", "displayName": "Mask", 
"required": false, "type": "boolean", "javaType": "java.lang.Boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": true, 
"description": "A flag that indicates whether to remove detected sensitive 
information (such as passwords) from MBean names and attributes." },
+    "updateRouteEnabled": { "index": 15, "kind": "attribute", "displayName": 
"Update Route Enabled", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Sets whether updating routes via JMX is 
allowed (is default disabled)." }
   }
 }
diff --git 
a/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
 
b/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
index 316ccf72302..020b03f8f3b 100644
--- 
a/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
+++ 
b/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
@@ -726,6 +726,10 @@ public abstract class AbstractCamelContextFactoryBean<T 
extends ModelCamelContex
             if (camelJMXAgent.getMask() != null) {
                 properties.put("mask", 
CamelContextHelper.parseBoolean(getContext(), camelJMXAgent.getMask()));
             }
+            if (camelJMXAgent.getUpdateRouteEnabled() != null) {
+                properties.put("updateRouteEnabled",
+                        CamelContextHelper.parseBoolean(getContext(), 
camelJMXAgent.getUpdateRouteEnabled()));
+            }
             if (camelJMXAgent.getLoadStatisticsEnabled() != null) {
                 properties.put("loadStatisticsEnabled",
                         CamelContextHelper.parseBoolean(getContext(), 
camelJMXAgent.getLoadStatisticsEnabled()));
diff --git 
a/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/CamelJMXAgentDefinition.java
 
b/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/CamelJMXAgentDefinition.java
index 591c409e129..cab7726eecc 100644
--- 
a/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/CamelJMXAgentDefinition.java
+++ 
b/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/CamelJMXAgentDefinition.java
@@ -76,6 +76,9 @@ public class CamelJMXAgentDefinition extends IdentifiedType {
     @XmlAttribute
     @Metadata(defaultValue = "true", javaType = "java.lang.Boolean")
     private String mask;
+    @XmlAttribute
+    @Metadata(defaultValue = "false", javaType = "java.lang.Boolean")
+    private String updateRouteEnabled;
 
     public String getDisabled() {
         return disabled;
@@ -234,6 +237,17 @@ public class CamelJMXAgentDefinition extends 
IdentifiedType {
         this.useHostIPAddress = useHostIPAddress;
     }
 
+    public String getUpdateRouteEnabled() {
+        return updateRouteEnabled;
+    }
+
+    /**
+     * Sets whether updating routes via JMX is allowed (is default disabled).
+     */
+    public void setUpdateRouteEnabled(String updateRouteEnabled) {
+        this.updateRouteEnabled = updateRouteEnabled;
+    }
+
     @Override
     public String toString() {
         StringJoiner buffer = new StringJoiner(", ", "CamelJMXAgent[", "]");
@@ -276,6 +290,9 @@ public class CamelJMXAgentDefinition extends IdentifiedType 
{
         if (mask != null) {
             buffer.add("mask=" + mask);
         }
+        if (updateRouteEnabled != null) {
+            buffer.add("updateRouteEnabled=" + updateRouteEnabled);
+        }
         return buffer.toString();
     }
 
diff --git 
a/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java
 
b/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java
index 6c7daa578bc..ca08ad52360 100644
--- 
a/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java
+++ 
b/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java
@@ -127,6 +127,8 @@ public class MainConfigurationPropertiesConfigurer extends 
org.apache.camel.supp
         case "JmxManagementNamePattern": 
target.setJmxManagementNamePattern(property(camelContext, 
java.lang.String.class, value)); return true;
         case "jmxmanagementstatisticslevel":
         case "JmxManagementStatisticsLevel": 
target.setJmxManagementStatisticsLevel(property(camelContext, 
org.apache.camel.ManagementStatisticsLevel.class, value)); return true;
+        case "jmxupdaterouteenabled":
+        case "JmxUpdateRouteEnabled": 
target.setJmxUpdateRouteEnabled(property(camelContext, boolean.class, value)); 
return true;
         case "lightweight":
         case "Lightweight": target.setLightweight(property(camelContext, 
boolean.class, value)); return true;
         case "loadhealthchecks":
@@ -366,6 +368,8 @@ public class MainConfigurationPropertiesConfigurer extends 
org.apache.camel.supp
         case "JmxManagementNamePattern": return java.lang.String.class;
         case "jmxmanagementstatisticslevel":
         case "JmxManagementStatisticsLevel": return 
org.apache.camel.ManagementStatisticsLevel.class;
+        case "jmxupdaterouteenabled":
+        case "JmxUpdateRouteEnabled": return boolean.class;
         case "lightweight":
         case "Lightweight": return boolean.class;
         case "loadhealthchecks":
@@ -606,6 +610,8 @@ public class MainConfigurationPropertiesConfigurer extends 
org.apache.camel.supp
         case "JmxManagementNamePattern": return 
target.getJmxManagementNamePattern();
         case "jmxmanagementstatisticslevel":
         case "JmxManagementStatisticsLevel": return 
target.getJmxManagementStatisticsLevel();
+        case "jmxupdaterouteenabled":
+        case "JmxUpdateRouteEnabled": return target.isJmxUpdateRouteEnabled();
         case "lightweight":
         case "Lightweight": return target.isLightweight();
         case "loadhealthchecks":
diff --git 
a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
 
b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
index 3a1734b8152..23395908207 100644
--- 
a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
+++ 
b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
@@ -71,6 +71,7 @@
     { "name": "camel.main.jmxManagementMBeansLevel", "description": "Sets the 
mbeans registration level. The default value is Default.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "object", 
"javaType": "org.apache.camel.ManagementMBeansLevel", "defaultValue": "Default" 
},
     { "name": "camel.main.jmxManagementNamePattern", "description": "The 
naming pattern for creating the CamelContext JMX management name. The default 
pattern is #name#", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "string", 
"javaType": "java.lang.String", "defaultValue": "#name#" },
     { "name": "camel.main.jmxManagementStatisticsLevel", "description": "Sets 
the JMX statistics level, the level can be set to Extended to gather additional 
information The default value is Default.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "object", 
"javaType": "org.apache.camel.ManagementStatisticsLevel", "defaultValue": 
"Default", "enum": [ "Extended", "Default", "RoutesOnly", "Off" ] },
+    { "name": "camel.main.jmxUpdateRouteEnabled", "description": "Whether to 
allow updating routes at runtime via JMX using the ManagedRouteMBean. This is 
disabled by default, but can be enabled for development and troubleshooting 
purposes, such as updating routes in an existing running Camel via JMX and 
other tools.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", 
"javaType": "boolean", "defaultValue": "false" },
     { "name": "camel.main.lightweight", "description": "Configure the context 
to be lightweight. This will trigger some optimizations and memory reduction 
options. Lightweight context have some limitations. At this moment, dynamic 
endpoint destinations are not supported.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", 
"javaType": "boolean", "defaultValue": "false" },
     { "name": "camel.main.loadHealthChecks", "description": "Whether to load 
custom health checks by scanning classpath.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", 
"javaType": "boolean", "defaultValue": "false" },
     { "name": "camel.main.loadStatisticsEnabled", "description": "Sets whether 
context load statistics is enabled (something like the unix load average). The 
statistics requires to have camel-management on the classpath as JMX is 
required. The default value is false.", "sourceType": 
"org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", 
"javaType": "boolean", "defaultValue": "false" },
diff --git a/core/camel-main/src/main/docs/main.adoc 
b/core/camel-main/src/main/docs/main.adoc
index 87322318756..45bfa21a833 100644
--- a/core/camel-main/src/main/docs/main.adoc
+++ b/core/camel-main/src/main/docs/main.adoc
@@ -19,7 +19,7 @@ The following tables lists all the options:
 
 // main options: START
 === Camel Main configurations
-The camel.main supports 116 options, which are listed below.
+The camel.main supports 117 options, which are listed below.
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
@@ -77,6 +77,7 @@ The camel.main supports 116 options, which are listed below.
 | *camel.main.jmxManagementMBeans{zwsp}Level* | Sets the mbeans registration 
level. The default value is Default. | Default | ManagementMBeansLevel
 | *camel.main.jmxManagementName{zwsp}Pattern* | The naming pattern for 
creating the CamelContext JMX management name. The default pattern is #name# | 
#name# | String
 | *camel.main.jmxManagement{zwsp}StatisticsLevel* | Sets the JMX statistics 
level, the level can be set to Extended to gather additional information The 
default value is Default. | Default | ManagementStatisticsLevel
+| *camel.main.jmxUpdateRoute{zwsp}Enabled* | Whether to allow updating routes 
at runtime via JMX using the ManagedRouteMBean. This is disabled by default, 
but can be enabled for development and troubleshooting purposes, such as 
updating routes in an existing running Camel via JMX and other tools. | false | 
boolean
 | *camel.main.lightweight* | Configure the context to be lightweight. This 
will trigger some optimizations and memory reduction options. Lightweight 
context have some limitations. At this moment, dynamic endpoint destinations 
are not supported. | false | boolean
 | *camel.main.loadHealthChecks* | Whether to load custom health checks by 
scanning classpath. | false | boolean
 | *camel.main.loadStatistics{zwsp}Enabled* | Sets whether context load 
statistics is enabled (something like the unix load average). The statistics 
requires to have camel-management on the classpath as JMX is required. The 
default value is false. | false | boolean
diff --git 
a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java
 
b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java
index 1ed607290fa..c403d714a0e 100644
--- 
a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java
+++ 
b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java
@@ -291,6 +291,8 @@ public final class DefaultConfigurationConfigurer {
                     .setMBeansLevel(config.getJmxManagementMBeansLevel());
             camelContext.getManagementStrategy().getManagementAgent()
                     
.setManagementNamePattern(config.getJmxManagementNamePattern());
+            camelContext.getManagementStrategy().getManagementAgent()
+                    .setUpdateRouteEnabled(config.isJmxUpdateRouteEnabled());
         }
         if (config.isCamelEventsTimestampEnabled()) {
             
camelContext.getManagementStrategy().getEventFactory().setTimestampEnabled(true);
diff --git 
a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java
 
b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java
index 3cdff9ae560..2e3fc64a8f3 100644
--- 
a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java
+++ 
b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java
@@ -131,6 +131,7 @@ public abstract class DefaultConfigurationProperties<T> {
     private String exchangeFactory = "default";
     private int exchangeFactoryCapacity = 100;
     private boolean exchangeFactoryStatisticsEnabled;
+    private boolean jmxUpdateRouteEnabled;
     @Metadata(enums = "xml,yaml")
     private String dumpRoutes;
     private String dumpRoutesInclude = "routes";
@@ -1326,6 +1327,20 @@ public abstract class DefaultConfigurationProperties<T> {
         this.routesReloadRestartDuration = routesReloadRestartDuration;
     }
 
+    public boolean isJmxUpdateRouteEnabled() {
+        return jmxUpdateRouteEnabled;
+    }
+
+    /**
+     * Whether to allow updating routes at runtime via JMX using the 
ManagedRouteMBean.
+     *
+     * This is disabled by default, but can be enabled for development and 
troubleshooting purposes, such as updating
+     * routes in an existing running Camel via JMX and other tools.
+     */
+    public void setJmxUpdateRouteEnabled(boolean jmxUpdateRouteEnabled) {
+        this.jmxUpdateRouteEnabled = jmxUpdateRouteEnabled;
+    }
+
     public boolean isLightweight() {
         return lightweight;
     }
diff --git 
a/core/camel-management-api/src/main/java/org/apache/camel/api/management/JmxSystemPropertyKeys.java
 
b/core/camel-management-api/src/main/java/org/apache/camel/api/management/JmxSystemPropertyKeys.java
index 99d8b0dffb8..51eafd2897f 100644
--- 
a/core/camel-management-api/src/main/java/org/apache/camel/api/management/JmxSystemPropertyKeys.java
+++ 
b/core/camel-management-api/src/main/java/org/apache/camel/api/management/JmxSystemPropertyKeys.java
@@ -64,6 +64,9 @@ public final class JmxSystemPropertyKeys {
     // flag to enable host ip address instead of host name
     public static final String USE_HOST_IP_ADDRESS = 
"org.apache.camel.jmx.useHostIPAddress";
 
+    // flag to enable updating routes via XML
+    public static final String UPDATE_ROUTE_ENABLED = 
"org.apache.camel.jmx.updateRouteEnabled";
+
     private JmxSystemPropertyKeys() {
         // not instantiated
     }
diff --git 
a/core/camel-management/src/main/java/org/apache/camel/management/DefaultManagementAgent.java
 
b/core/camel-management/src/main/java/org/apache/camel/management/DefaultManagementAgent.java
index 94b78e1eb86..ae761567c8a 100644
--- 
a/core/camel-management/src/main/java/org/apache/camel/management/DefaultManagementAgent.java
+++ 
b/core/camel-management/src/main/java/org/apache/camel/management/DefaultManagementAgent.java
@@ -72,6 +72,7 @@ public class DefaultManagementAgent extends ServiceSupport 
implements Management
     private Boolean mask = true;
     private Boolean includeHostName = false;
     private Boolean useHostIPAddress = false;
+    private Boolean updateRouteEnabled = false;
     private String managementNamePattern = "#name#";
     private ManagementStatisticsLevel statisticsLevel = 
ManagementStatisticsLevel.Default;
     private ManagementMBeansLevel mBeansLevel = ManagementMBeansLevel.Default;
@@ -141,6 +142,10 @@ public class DefaultManagementAgent extends ServiceSupport 
implements Management
             useHostIPAddress = 
Boolean.getBoolean(JmxSystemPropertyKeys.USE_HOST_IP_ADDRESS);
             values.put(JmxSystemPropertyKeys.USE_HOST_IP_ADDRESS, 
useHostIPAddress);
         }
+        if (System.getProperty(JmxSystemPropertyKeys.UPDATE_ROUTE_ENABLED) != 
null) {
+            updateRouteEnabled = 
Boolean.getBoolean(JmxSystemPropertyKeys.UPDATE_ROUTE_ENABLED);
+            values.put(JmxSystemPropertyKeys.UPDATE_ROUTE_ENABLED, 
updateRouteEnabled);
+        }
 
         if (!values.isEmpty()) {
             LOG.info("ManagementAgent detected JVM system properties: {}", 
values);
@@ -297,6 +302,16 @@ public class DefaultManagementAgent extends ServiceSupport 
implements Management
         this.mBeansLevel = mBeansLevel;
     }
 
+    @Override
+    public Boolean getUpdateRouteEnabled() {
+        return updateRouteEnabled != null && updateRouteEnabled;
+    }
+
+    @Override
+    public void setUpdateRouteEnabled(Boolean updateRouteEnabled) {
+        this.updateRouteEnabled = updateRouteEnabled;
+    }
+
     @Override
     public CamelContext getCamelContext() {
         return camelContext;
diff --git 
a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java
 
b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java
index 0bd96f85748..27dcacf9339 100644
--- 
a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java
+++ 
b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java
@@ -678,6 +678,12 @@ public class ManagedRoute extends 
ManagedPerformanceCounter implements TimerList
 
     @Override
     public void updateRouteFromXml(String xml) throws Exception {
+        // check whether this is allowed
+        Boolean enabled = 
context.getManagementStrategy().getManagementAgent().getUpdateRouteEnabled();
+        if (enabled == null || !enabled) {
+            throw new IllegalAccessException("Updating route is not enabled");
+        }
+
         // convert to model from xml
         ExtendedCamelContext ecc = context.getCamelContextExtension();
         InputStream is = 
context.getTypeConverter().convertTo(InputStream.class, xml);
diff --git 
a/core/camel-management/src/test/java/org/apache/camel/management/DefaultManagementAgentMockTest.java
 
b/core/camel-management/src/test/java/org/apache/camel/management/DefaultManagementAgentMockTest.java
index ec98268aa60..8e8c6ec344b 100644
--- 
a/core/camel-management/src/test/java/org/apache/camel/management/DefaultManagementAgentMockTest.java
+++ 
b/core/camel-management/src/test/java/org/apache/camel/management/DefaultManagementAgentMockTest.java
@@ -79,7 +79,7 @@ public class DefaultManagementAgentMockTest {
     }
 
     @Test
-    public void testShouldUseHostIPAddressWhenFlagisTrue() throws Exception {
+    public void testShouldUseHostIPAddressWhenFlagIsTrue() throws Exception {
         System.setProperty(JmxSystemPropertyKeys.USE_HOST_IP_ADDRESS, "true");
         try {
             CamelContext ctx = new DefaultCamelContext();
@@ -94,7 +94,7 @@ public class DefaultManagementAgentMockTest {
     }
 
     @Test
-    public void shouldUseHostNameWhenFlagisFalse() throws Exception {
+    public void shouldUseHostNameWhenFlagIsFalse() throws Exception {
         System.setProperty(JmxSystemPropertyKeys.USE_HOST_IP_ADDRESS, "false");
         try {
             CamelContext ctx = new DefaultCamelContext();
diff --git 
a/core/camel-management/src/test/java/org/apache/camel/management/ManagedRouteUpdateRouteFromXmlTest.java
 
b/core/camel-management/src/test/java/org/apache/camel/management/ManagedRouteUpdateRouteFromXmlTest.java
index 7ba41bffef7..378aa6ee7ad 100644
--- 
a/core/camel-management/src/test/java/org/apache/camel/management/ManagedRouteUpdateRouteFromXmlTest.java
+++ 
b/core/camel-management/src/test/java/org/apache/camel/management/ManagedRouteUpdateRouteFromXmlTest.java
@@ -21,6 +21,7 @@ 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.junit.jupiter.api.Test;
@@ -33,6 +34,16 @@ import static org.junit.jupiter.api.Assertions.fail;
 @DisabledOnOs(OS.AIX)
 public class ManagedRouteUpdateRouteFromXmlTest extends ManagementTestSupport {
 
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext context = super.createCamelContext();
+
+        // enable updating route
+        
context.getManagementStrategy().getManagementAgent().setUpdateRouteEnabled(true);
+
+        return context;
+    }
+
     @Test
     public void testUpdateRouteFromXml() throws Exception {
         MBeanServer mbeanServer = getMBeanServer();
diff --git a/dsl/camel-kamelet-main/src/main/docs/kamelet-main.adoc 
b/dsl/camel-kamelet-main/src/main/docs/kamelet-main.adoc
index d44520fc044..2caa3ec9d9f 100644
--- a/dsl/camel-kamelet-main/src/main/docs/kamelet-main.adoc
+++ b/dsl/camel-kamelet-main/src/main/docs/kamelet-main.adoc
@@ -23,6 +23,7 @@ The `KameletMain` is pre-configured with the following 
properties:
 camel.component.kamelet.location = 
classpath:/kamelets,github:apache:camel-kamelets/kamelets
 camel.component.rest.consumerComponentName = platform-http
 camel.component.rest.producerComponentName = vertx-http
+came.main.jmxUpdateRouteEnabled = true
 ----
 
 These settings can be overridden by configuration in `application.properties`.
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
index ac0c743e291..f9480d9747e 100644
--- 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
@@ -718,6 +718,7 @@ public class KameletMain extends MainCommandLineSupport {
         addInitialProperty("camel.component.kamelet.location", location);
         addInitialProperty("camel.component.rest.consumerComponentName", 
"platform-http");
         addInitialProperty("camel.component.rest.producerComponentName", 
"vertx-http");
+        addInitialProperty("came.main.jmxUpdateRouteEnabled", "true");
     }
 
     protected String startupInfo() {

Reply via email to