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 2020/02/04 18:54:47 UTC

[camel] 01/02: CAMEL-14484: Make XML dumper its own model outside camel-core-engine

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

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

commit 7282c926a8e582ed090c7ba444ab371cfe11741b
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Feb 4 16:55:36 2020 +0100

    CAMEL-14484: Make XML dumper its own model outside camel-core-engine
---
 components/camel-blueprint/pom.xml                 |   4 +
 components/camel-openapi-java/pom.xml              |   4 +
 .../apache/camel/openapi/RestOpenApiSupport.java   |  22 +-
 .../RestOpenApiReaderPropertyPlaceholderTest.java  |   2 +-
 components/camel-spring/pom.xml                    |   4 +
 components/camel-swagger-java/pom.xml              |   4 +
 .../apache/camel/swagger/RestSwaggerSupport.java   |  20 +-
 .../RestSwaggerReaderPropertyPlaceholderTest.java  |   2 +-
 .../camel/spi/XMLRoutesDefinitionLoader.java       |   6 +
 core/camel-core-engine/pom.xml                     |   4 -
 .../java/org/apache/camel/model/ModelHelper.java   | 407 ---------------------
 .../apache/camel/util/CreateModelFromXmlTest.java  |   9 +-
 .../management/mbean/ManagedCamelContext.java      |  32 +-
 .../camel/management/mbean/ManagedRoute.java       |  10 +-
 .../in/ModelParserXMLRoutesDefinitionLoader.java   |   6 +
 .../camel/xml/jaxb/JaxbModelToXMLDumper.java       |   3 +-
 .../xml/jaxb/JaxbXMLRoutesDefinitionLoader.java    |  51 +++
 .../modules/ROOT/pages/camel-3x-upgrade-guide.adoc |   5 +
 .../commands/AbstractLocalCamelController.java     |   8 +-
 .../itest/DuplicateNamespacePrefixIssueTest.java   |  10 +-
 .../generator/openapi/RestDslXmlGenerator.java     |   5 +-
 .../generator/swagger/RestDslXmlGenerator.java     |   5 +-
 22 files changed, 142 insertions(+), 481 deletions(-)

diff --git a/components/camel-blueprint/pom.xml b/components/camel-blueprint/pom.xml
index d037b4b..61c34fc 100644
--- a/components/camel-blueprint/pom.xml
+++ b/components/camel-blueprint/pom.xml
@@ -52,6 +52,10 @@
         </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
+            <artifactId>camel-jaxp</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
             <artifactId>camel-bean</artifactId>
         </dependency>
         <dependency>
diff --git a/components/camel-openapi-java/pom.xml b/components/camel-openapi-java/pom.xml
index 5fd3a1c..728dba4 100644
--- a/components/camel-openapi-java/pom.xml
+++ b/components/camel-openapi-java/pom.xml
@@ -50,6 +50,10 @@
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-core-engine</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-xml-jaxb</artifactId>
+        </dependency>
 
         <!-- json -->
         <dependency>
diff --git a/components/camel-openapi-java/src/main/java/org/apache/camel/openapi/RestOpenApiSupport.java b/components/camel-openapi-java/src/main/java/org/apache/camel/openapi/RestOpenApiSupport.java
index ed82997..f156b8f 100644
--- a/components/camel-openapi-java/src/main/java/org/apache/camel/openapi/RestOpenApiSupport.java
+++ b/components/camel-openapi-java/src/main/java/org/apache/camel/openapi/RestOpenApiSupport.java
@@ -16,7 +16,6 @@
  */
 package org.apache.camel.openapi;
 
-
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.lang.management.ManagementFactory;
@@ -37,6 +36,7 @@ import javax.management.AttributeNotFoundException;
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
 
+import org.apache.camel.ExtendedCamelContext;
 import org.w3c.dom.Document;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
@@ -57,7 +57,6 @@ import io.apicurio.datamodels.openapi.v3.models.Oas30Server;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
 import org.apache.camel.model.Model;
-import org.apache.camel.model.ModelHelper;
 import org.apache.camel.model.rest.RestDefinition;
 import org.apache.camel.model.rest.RestsDefinition;
 import org.apache.camel.spi.ClassResolver;
@@ -70,7 +69,6 @@ import org.apache.camel.util.xml.XmlLineNumberParser;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-
 import static org.apache.camel.openapi.OpenApiHelper.clearVendorExtensions;
 
 /**
@@ -206,7 +204,8 @@ public class RestOpenApiSupport {
         // use a routes definition to dump the rests
         RestsDefinition def = new RestsDefinition();
         def.setRests(rests);
-        String xml = ModelHelper.dumpModelAsXml(camelContext, def);
+        ExtendedCamelContext ecc = camelContext.adapt(ExtendedCamelContext.class);
+        String xml = ecc.getModelToXMLDumper().dumpModelAsXml(camelContext, def);
 
         // if resolving placeholders we parse the xml, and resolve the property placeholders during parsing
         final AtomicBoolean changed = new AtomicBoolean();
@@ -229,7 +228,8 @@ public class RestOpenApiSupport {
         // okay there were some property placeholder replaced so re-create the model
         if (changed.get()) {
             xml = camelContext.getTypeConverter().mandatoryConvertTo(String.class, dom);
-            def = ModelHelper.createModelFromXml(camelContext, xml, RestsDefinition.class);
+            InputStream xmlis = camelContext.getTypeConverter().convertTo(InputStream.class, xml);
+            def = (RestsDefinition) ecc.getXMLRoutesDefinitionLoader().loadRestsDefinition(camelContext, xmlis);
             if (def != null) {
                 return def.getRests();
             }
@@ -238,7 +238,7 @@ public class RestOpenApiSupport {
         return rests;
     }
 
-    public List<RestDefinition> getRestDefinitions(String camelId) throws Exception {
+    public List<RestDefinition> getRestDefinitions(CamelContext camelContext, String camelId) throws Exception {
         ObjectName found = null;
         boolean supportResolvePlaceholder = false;
 
@@ -271,7 +271,9 @@ public class RestOpenApiSupport {
             }
             if (xml != null) {
                 LOG.debug("DumpRestAsXml:\n{}", xml);
-                RestsDefinition rests = ModelHelper.createModelFromXml(null, xml, RestsDefinition.class);
+                InputStream xmlis = camelContext.getTypeConverter().convertTo(InputStream.class, xml);
+                ExtendedCamelContext ecc = camelContext.adapt(ExtendedCamelContext.class);
+                RestsDefinition rests = (RestsDefinition) ecc.getXMLRoutesDefinitionLoader().loadRestsDefinition(camelContext, xmlis);
                 if (rests != null) {
                     return rests.getRests();
                 }
@@ -321,11 +323,11 @@ public class RestOpenApiSupport {
             setupCorsHeaders(response, configuration.getCorsHeaders());
         }
 
-        List<RestDefinition> rests = null;
-        if (camelContext != null && camelContext.getName().equals(contextId)) {
+        List<RestDefinition> rests;
+        if (camelContext.getName().equals(contextId)) {
             rests = getRestDefinitions(camelContext);
         } else {
-            rests = getRestDefinitions(contextId);
+            rests = getRestDefinitions(camelContext, contextId);
         }
 
         if (rests != null) {
diff --git a/components/camel-openapi-java/src/test/java/org/apache/camel/openapi/RestOpenApiReaderPropertyPlaceholderTest.java b/components/camel-openapi-java/src/test/java/org/apache/camel/openapi/RestOpenApiReaderPropertyPlaceholderTest.java
index bf0fccb..6c6ece5 100644
--- a/components/camel-openapi-java/src/test/java/org/apache/camel/openapi/RestOpenApiReaderPropertyPlaceholderTest.java
+++ b/components/camel-openapi-java/src/test/java/org/apache/camel/openapi/RestOpenApiReaderPropertyPlaceholderTest.java
@@ -79,7 +79,7 @@ public class RestOpenApiReaderPropertyPlaceholderTest extends CamelTestSupport {
         RestOpenApiReader reader = new RestOpenApiReader();
 
         RestOpenApiSupport support = new RestOpenApiSupport();
-        List<RestDefinition> rests = support.getRestDefinitions(context.getName());
+        List<RestDefinition> rests = support.getRestDefinitions(context, context.getName());
 
         OasDocument openApi = reader.read(rests, null, config, context.getName(), new DefaultClassResolver());
         assertNotNull(openApi);
diff --git a/components/camel-spring/pom.xml b/components/camel-spring/pom.xml
index e2b9b06..1241072 100644
--- a/components/camel-spring/pom.xml
+++ b/components/camel-spring/pom.xml
@@ -39,6 +39,10 @@
         </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
+            <artifactId>camel-jaxp</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
             <artifactId>camel-bean</artifactId>
         </dependency>
         <dependency>
diff --git a/components/camel-swagger-java/pom.xml b/components/camel-swagger-java/pom.xml
index 539056f..3bfc607 100644
--- a/components/camel-swagger-java/pom.xml
+++ b/components/camel-swagger-java/pom.xml
@@ -48,6 +48,10 @@
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-core-engine</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-xml-jaxb</artifactId>
+        </dependency>
 
         <!-- json -->
         <dependency>
diff --git a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerSupport.java b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerSupport.java
index fe32ed2..bce28c4 100644
--- a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerSupport.java
+++ b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerSupport.java
@@ -32,6 +32,7 @@ import javax.management.AttributeNotFoundException;
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
 
+import org.apache.camel.ExtendedCamelContext;
 import org.w3c.dom.Document;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
@@ -49,7 +50,6 @@ import io.swagger.util.Yaml;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
 import org.apache.camel.model.Model;
-import org.apache.camel.model.ModelHelper;
 import org.apache.camel.model.rest.RestDefinition;
 import org.apache.camel.model.rest.RestsDefinition;
 import org.apache.camel.spi.ClassResolver;
@@ -155,7 +155,8 @@ public class RestSwaggerSupport {
         // use a routes definition to dump the rests
         RestsDefinition def = new RestsDefinition();
         def.setRests(rests);
-        String xml = ModelHelper.dumpModelAsXml(camelContext, def);
+        ExtendedCamelContext ecc = camelContext.adapt(ExtendedCamelContext.class);
+        String xml = ecc.getModelToXMLDumper().dumpModelAsXml(camelContext, def);
 
         // if resolving placeholders we parse the xml, and resolve the property placeholders during parsing
         final AtomicBoolean changed = new AtomicBoolean();
@@ -178,7 +179,8 @@ public class RestSwaggerSupport {
         // okay there were some property placeholder replaced so re-create the model
         if (changed.get()) {
             xml = camelContext.getTypeConverter().mandatoryConvertTo(String.class, dom);
-            def = ModelHelper.createModelFromXml(camelContext, xml, RestsDefinition.class);
+            InputStream isxml = camelContext.getTypeConverter().convertTo(InputStream.class, xml);
+            def = (RestsDefinition) ecc.getXMLRoutesDefinitionLoader().loadRestsDefinition(camelContext, isxml);
             if (def != null) {
                 return def.getRests();
             }
@@ -187,7 +189,7 @@ public class RestSwaggerSupport {
         return rests;
     }
 
-    public List<RestDefinition> getRestDefinitions(String camelId) throws Exception {
+    public List<RestDefinition> getRestDefinitions(CamelContext camelContext, String camelId) throws Exception {
         ObjectName found = null;
         boolean supportResolvePlaceholder = false;
 
@@ -219,7 +221,9 @@ public class RestSwaggerSupport {
             }
             if (xml != null) {
                 LOG.debug("DumpRestAsXml:\n{}", xml);
-                RestsDefinition rests = ModelHelper.createModelFromXml(null, xml, RestsDefinition.class);
+                InputStream isxml = camelContext.getTypeConverter().convertTo(InputStream.class, xml);
+                ExtendedCamelContext ecc = camelContext.adapt(ExtendedCamelContext.class);
+                RestsDefinition rests = (RestsDefinition) ecc.getXMLRoutesDefinitionLoader().loadRestsDefinition(camelContext, isxml);
                 if (rests != null) {
                     return rests.getRests();
                 }
@@ -266,11 +270,11 @@ public class RestSwaggerSupport {
             setupCorsHeaders(response, configuration.getCorsHeaders());
         }
 
-        List<RestDefinition> rests = null;
-        if (camelContext != null && camelContext.getName().equals(contextId)) {
+        List<RestDefinition> rests;
+        if (camelContext.getName().equals(contextId)) {
             rests = getRestDefinitions(camelContext);
         } else {
-            rests = getRestDefinitions(contextId);
+            rests = getRestDefinitions(camelContext, contextId);
         }
 
         if (rests != null) {
diff --git a/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/RestSwaggerReaderPropertyPlaceholderTest.java b/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/RestSwaggerReaderPropertyPlaceholderTest.java
index 387a155..f4b8be2 100644
--- a/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/RestSwaggerReaderPropertyPlaceholderTest.java
+++ b/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/RestSwaggerReaderPropertyPlaceholderTest.java
@@ -84,7 +84,7 @@ public class RestSwaggerReaderPropertyPlaceholderTest extends CamelTestSupport {
         RestSwaggerReader reader = new RestSwaggerReader();
 
         RestSwaggerSupport support = new RestSwaggerSupport();
-        List<RestDefinition> rests = support.getRestDefinitions(context.getName());
+        List<RestDefinition> rests = support.getRestDefinitions(context, context.getName());
 
         Swagger swagger = reader.read(rests, null, config, context.getName(), new DefaultClassResolver());
         assertNotNull(swagger);
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/XMLRoutesDefinitionLoader.java b/core/camel-api/src/main/java/org/apache/camel/spi/XMLRoutesDefinitionLoader.java
index 3fc06c2..2a3a741 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/XMLRoutesDefinitionLoader.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/XMLRoutesDefinitionLoader.java
@@ -19,6 +19,7 @@ package org.apache.camel.spi;
 import java.io.InputStream;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.NamedNode;
 
 /**
  * SPI for loading routes/rests from XML input streams and parsing this to model definition classes.
@@ -36,4 +37,9 @@ public interface XMLRoutesDefinitionLoader {
      */
     Object loadRestsDefinition(CamelContext context, InputStream inputStream) throws Exception;
 
+    /**
+     * Creates a model of the given type from the xml
+     */
+    <T extends NamedNode> T createModelFromXml(CamelContext context, String xml, Class<T> type) throws Exception;
+
 }
diff --git a/core/camel-core-engine/pom.xml b/core/camel-core-engine/pom.xml
index f9e70a2..6ac7415 100644
--- a/core/camel-core-engine/pom.xml
+++ b/core/camel-core-engine/pom.xml
@@ -70,10 +70,6 @@
         </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
-            <artifactId>camel-jaxp</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.camel</groupId>
             <artifactId>camel-management-api</artifactId>
         </dependency>
         <dependency>
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/ModelHelper.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/ModelHelper.java
deleted file mode 100644
index 63134c3..0000000
--- a/core/camel-core-engine/src/main/java/org/apache/camel/model/ModelHelper.java
+++ /dev/null
@@ -1,407 +0,0 @@
-/*
- * 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.model;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.io.StringWriter;
-import java.nio.charset.StandardCharsets;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import javax.xml.bind.Binder;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-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.DelegateEndpoint;
-import org.apache.camel.Endpoint;
-import org.apache.camel.Expression;
-import org.apache.camel.ExtendedCamelContext;
-import org.apache.camel.NamedNode;
-import org.apache.camel.TypeConversionException;
-import org.apache.camel.converter.jaxp.XmlConverter;
-import org.apache.camel.model.language.ExpressionDefinition;
-import org.apache.camel.model.rest.RestsDefinition;
-import org.apache.camel.spi.ModelJAXBContextFactory;
-import org.apache.camel.spi.NamespaceAware;
-import org.apache.camel.spi.TypeConverterRegistry;
-import org.apache.camel.util.xml.XmlLineNumberParser;
-
-import static org.apache.camel.model.ProcessorDefinitionHelper.filterTypeInOutputs;
-
-/**
- * Helper for the Camel {@link org.apache.camel.model model} classes.
- */
-@Deprecated
-public final class ModelHelper {
-
-    private ModelHelper() {
-        // utility class
-    }
-
-    /**
-     * Dumps the definition as XML
-     *
-     * @param context the CamelContext, if <tt>null</tt> then
-     *            {@link org.apache.camel.spi.ModelJAXBContextFactory} is not in
-     *            use
-     * @param definition the definition, such as a
-     *            {@link org.apache.camel.NamedNode}
-     * @return the output in XML (is formatted)
-     * @throws JAXBException is throw if error marshalling to XML
-     */
-    @Deprecated
-    public static String dumpModelAsXml(CamelContext context, NamedNode definition) throws JAXBException {
-        JAXBContext jaxbContext = getJAXBContext(context);
-        final Map<String, String> namespaces = new LinkedHashMap<>();
-
-        // gather all namespaces from the routes or route which is stored on the
-        // expression nodes
-        if (definition instanceof RoutesDefinition) {
-            List<RouteDefinition> routes = ((RoutesDefinition)definition).getRoutes();
-            for (RouteDefinition route : routes) {
-                extractNamespaces(route, namespaces);
-            }
-        } else if (definition instanceof RouteDefinition) {
-            RouteDefinition route = (RouteDefinition)definition;
-            extractNamespaces(route, namespaces);
-        }
-
-        Marshaller marshaller = jaxbContext.createMarshaller();
-        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
-        marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
-        StringWriter buffer = new StringWriter();
-        marshaller.marshal(definition, buffer);
-
-        XmlConverter xmlConverter = newXmlConverter(context);
-        String xml = buffer.toString();
-        Document dom;
-        try {
-            dom = xmlConverter.toDOMDocument(xml, null);
-        } catch (Exception e) {
-            throw new TypeConversionException(xml, Document.class, e);
-        }
-
-        // Add additional namespaces to the document root element
-        Element documentElement = dom.getDocumentElement();
-        for (String nsPrefix : namespaces.keySet()) {
-            String prefix = nsPrefix.equals("xmlns") ? nsPrefix : "xmlns:" + nsPrefix;
-            documentElement.setAttribute(prefix, namespaces.get(nsPrefix));
-        }
-
-        // We invoke the type converter directly because we need to pass some
-        // custom XML output options
-        Properties outputProperties = new Properties();
-        outputProperties.put(OutputKeys.INDENT, "yes");
-        outputProperties.put(OutputKeys.STANDALONE, "yes");
-        outputProperties.put(OutputKeys.ENCODING, "UTF-8");
-        try {
-            return xmlConverter.toStringFromDocument(dom, outputProperties);
-        } catch (TransformerException e) {
-            throw new IllegalStateException("Failed converting document object to string", e);
-        }
-    }
-
-    /**
-     * Dumps the definition as XML
-     *
-     * @param context the CamelContext, if <tt>null</tt> then
-     *            {@link org.apache.camel.spi.ModelJAXBContextFactory} is not in
-     *            use
-     * @param definition the definition, such as a
-     *            {@link org.apache.camel.NamedNode}
-     * @param resolvePlaceholders whether to resolve property placeholders in
-     *            the dumped XML
-     * @param resolveDelegateEndpoints whether to resolve delegate endpoints in
-     *            the dumped XML (limited to endpoints used in uri attributes in
-     *            the model)
-     * @return the output in XML (is formatted)
-     * @throws Exception is throw if error marshalling to XML
-     */
-    @Deprecated
-    public static String dumpModelAsXml(CamelContext context, NamedNode definition, boolean resolvePlaceholders, boolean resolveDelegateEndpoints) throws Exception {
-        String xml = ModelHelper.dumpModelAsXml(context, definition);
-
-        // if resolving placeholders we parse the xml, and resolve the property
-        // placeholders during parsing
-        if (resolvePlaceholders || resolveDelegateEndpoints) {
-            final AtomicBoolean changed = new AtomicBoolean();
-            InputStream is = new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8));
-            Document dom = XmlLineNumberParser.parseXml(is, new XmlLineNumberParser.XmlTextTransformer() {
-
-                private String prev;
-
-                @Override
-                public String transform(String text) {
-                    String after = text;
-                    if (resolveDelegateEndpoints && "uri".equals(prev)) {
-                        try {
-                            // must resolve placeholder as the endpoint may use
-                            // property placeholders
-                            String uri = context.resolvePropertyPlaceholders(text);
-                            Endpoint endpoint = context.hasEndpoint(uri);
-                            if (endpoint instanceof DelegateEndpoint) {
-                                endpoint = ((DelegateEndpoint)endpoint).getEndpoint();
-                                after = endpoint.getEndpointUri();
-                            }
-                        } catch (Exception e) {
-                            // ignore
-                        }
-                    }
-
-                    if (resolvePlaceholders) {
-                        try {
-                            after = context.resolvePropertyPlaceholders(after);
-                        } catch (Exception e) {
-                            // ignore
-                        }
-                    }
-
-                    if (!changed.get()) {
-                        changed.set(!text.equals(after));
-                    }
-
-                    // okay the previous must be the attribute key with uri, so
-                    // it refers to an endpoint
-                    prev = text;
-
-                    return after;
-                }
-            });
-
-            // okay there were some property placeholder or delegate endpoints
-            // replaced so re-create the model
-            if (changed.get()) {
-                xml = context.getTypeConverter().mandatoryConvertTo(String.class, dom);
-                NamedNode copy = ModelHelper.createModelFromXml(context, xml, NamedNode.class);
-                xml = ModelHelper.dumpModelAsXml(context, copy);
-            }
-        }
-
-        return xml;
-    }
-
-    /**
-     * 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 xml the xml
-     * @param type the definition type to return, will throw a
-     *            {@link ClassCastException} if not the expected type
-     * @return the model definition
-     * @throws javax.xml.bind.JAXBException is thrown if error unmarshalling
-     *             from xml to model
-     */
-    public static <T extends NamedNode> T createModelFromXml(CamelContext context, String xml, Class<T> type) throws JAXBException {
-        return modelToXml(context, null, xml, type);
-    }
-
-    /**
-     * 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 stream the xml stream
-     * @param type the definition type to return, will throw a
-     *            {@link ClassCastException} if not the expected type
-     * @return the model definition
-     * @throws javax.xml.bind.JAXBException is thrown if error unmarshalling
-     *             from xml to model
-     */
-    public static <T extends NamedNode> T createModelFromXml(CamelContext context, InputStream stream, Class<T> type) throws JAXBException {
-        return modelToXml(context, stream, null, type);
-    }
-
-    /**
-     * 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 inputStream the xml stream
-     * @throws Exception is thrown if an error is encountered unmarshalling from
-     *             xml to model
-     *
-     * @deprecated use {@link org.apache.camel.spi.XMLRoutesDefinitionLoader} from {@link ExtendedCamelContext}
-     */
-    @Deprecated
-    public static RoutesDefinition loadRoutesDefinition(CamelContext context, InputStream inputStream) throws Exception {
-        ExtendedCamelContext ecc = context.adapt(ExtendedCamelContext.class);
-        return (RoutesDefinition) ecc.getXMLRoutesDefinitionLoader().loadRoutesDefinition(context, inputStream);
-    }
-
-    /**
-     * @deprecated use {@link org.apache.camel.spi.XMLRoutesDefinitionLoader} from {@link ExtendedCamelContext}
-     */
-    @Deprecated
-    public static RestsDefinition loadRestsDefinition(CamelContext context, InputStream inputStream) throws Exception {
-        ExtendedCamelContext ecc = context.adapt(ExtendedCamelContext.class);
-        return (RestsDefinition) ecc.getXMLRoutesDefinitionLoader().loadRestsDefinition(context, inputStream);
-    }
-
-    private static <T extends NamedNode> T modelToXml(CamelContext context, InputStream is, String xml, Class<T> type) throws JAXBException {
-        JAXBContext jaxbContext = getJAXBContext(context);
-
-        XmlConverter xmlConverter = newXmlConverter(context);
-        Document dom = null;
-        try {
-            if (is != null) {
-                dom = xmlConverter.toDOMDocument(is, null);
-            } else if (xml != null) {
-                dom = xmlConverter.toDOMDocument(xml, null);
-            }
-        } catch (Exception e) {
-            throw new TypeConversionException(xml, Document.class, e);
-        }
-        if (dom == null) {
-            throw new IllegalArgumentException("InputStream and XML is both null");
-        }
-
-        Map<String, String> namespaces = new LinkedHashMap<>();
-        extractNamespaces(dom, namespaces);
-
-        Binder<Node> binder = jaxbContext.createBinder();
-        Object result = binder.unmarshal(dom);
-
-        if (result == null) {
-            throw new JAXBException("Cannot unmarshal to " + type + " using JAXB");
-        }
-
-        // Restore namespaces to anything that's NamespaceAware
-        if (result instanceof RoutesDefinition) {
-            List<RouteDefinition> routes = ((RoutesDefinition)result).getRoutes();
-            for (RouteDefinition route : routes) {
-                applyNamespaces(route, namespaces);
-            }
-        } else if (result instanceof RouteDefinition) {
-            RouteDefinition route = (RouteDefinition)result;
-            applyNamespaces(route, namespaces);
-        }
-
-        return type.cast(result);
-    }
-
-    private static JAXBContext getJAXBContext(CamelContext context) throws JAXBException {
-        ModelJAXBContextFactory factory = context.adapt(ExtendedCamelContext.class).getModelJAXBContextFactory();
-        return factory.newJAXBContext();
-    }
-
-    private static void applyNamespaces(RouteDefinition route, Map<String, String> namespaces) {
-        Iterator<ExpressionNode> it = filterTypeInOutputs(route.getOutputs(), ExpressionNode.class);
-        while (it.hasNext()) {
-            NamespaceAware na = getNamespaceAwareFromExpression(it.next());
-            if (na != null) {
-                na.setNamespaces(namespaces);
-            }
-        }
-    }
-
-    private static NamespaceAware getNamespaceAwareFromExpression(ExpressionNode expressionNode) {
-        ExpressionDefinition ed = expressionNode.getExpression();
-
-        NamespaceAware na = null;
-        Expression exp = ed.getExpressionValue();
-        if (exp instanceof NamespaceAware) {
-            na = (NamespaceAware)exp;
-        } else if (ed instanceof NamespaceAware) {
-            na = (NamespaceAware)ed;
-        }
-
-        return na;
-    }
-
-    /**
-     * Extract all XML namespaces from the expressions in the route
-     *
-     * @param route the route
-     * @param namespaces the map of namespaces to add discovered XML namespaces
-     *            into
-     */
-    private static void extractNamespaces(RouteDefinition route, Map<String, String> namespaces) {
-        Iterator<ExpressionNode> it = filterTypeInOutputs(route.getOutputs(), ExpressionNode.class);
-        while (it.hasNext()) {
-            NamespaceAware na = getNamespaceAwareFromExpression(it.next());
-
-            if (na != null) {
-                Map<String, String> map = na.getNamespaces();
-                if (map != null && !map.isEmpty()) {
-                    namespaces.putAll(map);
-                }
-            }
-        }
-    }
-
-    /**
-     * Extract all XML namespaces from the root element in a DOM Document
-     *
-     * @param document the DOM document
-     * @param namespaces the map of namespaces to add new found XML namespaces
-     */
-    private static void extractNamespaces(Document document, Map<String, String> namespaces) throws JAXBException {
-        NamedNodeMap attributes = document.getDocumentElement().getAttributes();
-        for (int i = 0; i < attributes.getLength(); i++) {
-            Node item = attributes.item(i);
-            String nsPrefix = item.getNodeName();
-            if (nsPrefix != null && nsPrefix.startsWith("xmlns")) {
-                String nsValue = item.getNodeValue();
-                String[] nsParts = nsPrefix.split(":");
-                if (nsParts.length == 1) {
-                    namespaces.put(nsParts[0], nsValue);
-                } else if (nsParts.length == 2) {
-                    namespaces.put(nsParts[1], nsValue);
-                } else {
-                    // Fallback on adding the namespace prefix as we find it
-                    namespaces.put(nsPrefix, nsValue);
-                }
-            }
-        }
-    }
-
-    /**
-     * Creates a new {@link XmlConverter}
-     *
-     * @param context CamelContext if provided
-     * @return a new XmlConverter instance
-     */
-    private static XmlConverter newXmlConverter(CamelContext context) {
-        XmlConverter xmlConverter;
-        if (context != null) {
-            TypeConverterRegistry registry = context.getTypeConverterRegistry();
-            xmlConverter = registry.getInjector().newInstance(XmlConverter.class, false);
-        } else {
-            xmlConverter = new XmlConverter();
-        }
-        return xmlConverter;
-    }
-
-}
diff --git a/core/camel-core/src/test/java/org/apache/camel/util/CreateModelFromXmlTest.java b/core/camel-core/src/test/java/org/apache/camel/util/CreateModelFromXmlTest.java
index e83a3f0..f5c3048 100644
--- a/core/camel-core/src/test/java/org/apache/camel/util/CreateModelFromXmlTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/util/CreateModelFromXmlTest.java
@@ -23,8 +23,8 @@ import java.util.Map;
 
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Expression;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.model.ExpressionNode;
-import org.apache.camel.model.ModelHelper;
 import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.model.RoutesDefinition;
 import org.apache.camel.model.language.ExpressionDefinition;
@@ -88,14 +88,17 @@ public class CreateModelFromXmlTest extends ContextTestSupport {
     }
 
     private RoutesDefinition createModelFromXml(String camelContextResource, boolean fromString) throws Exception {
+        ExtendedCamelContext ecc = context.adapt(ExtendedCamelContext.class);
+
         InputStream inputStream = getClass().getResourceAsStream(camelContextResource);
 
         if (fromString) {
             String xml = context.getTypeConverter().convertTo(String.class, inputStream);
-            return ModelHelper.createModelFromXml(context, xml, RoutesDefinition.class);
+            InputStream isxml = context.getTypeConverter().convertTo(InputStream.class, xml);
+            return (RoutesDefinition) ecc.getXMLRoutesDefinitionLoader().loadRoutesDefinition(context, isxml);
         }
 
-        return ModelHelper.createModelFromXml(context, inputStream, RoutesDefinition.class);
+        return (RoutesDefinition) ecc.getXMLRoutesDefinitionLoader().loadRoutesDefinition(context, inputStream);
     }
 
     private void assertNamespacesPresent(RoutesDefinition routesDefinition, Map<String, String> expectedNamespaces) {
diff --git a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java
index 9ee72c5..37e9146 100644
--- a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java
+++ b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java
@@ -26,7 +26,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
 
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
@@ -48,13 +47,11 @@ import org.apache.camel.api.management.mbean.ManagedProcessorMBean;
 import org.apache.camel.api.management.mbean.ManagedRouteMBean;
 import org.apache.camel.api.management.mbean.ManagedStepMBean;
 import org.apache.camel.model.Model;
-import org.apache.camel.model.ModelHelper;
 import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.model.RoutesDefinition;
 import org.apache.camel.model.rest.RestDefinition;
 import org.apache.camel.model.rest.RestsDefinition;
 import org.apache.camel.spi.ManagementStrategy;
-import org.apache.camel.util.xml.XmlLineNumberParser;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -415,34 +412,9 @@ public class ManagedCamelContext extends ManagedPerformanceCounter implements Ti
         // use a routes definition to dump the rests
         RestsDefinition def = new RestsDefinition();
         def.setRests(rests);
-        ExtendedCamelContext ecc = context.adapt(ExtendedCamelContext.class);
-        String xml = ecc.getModelToXMLDumper().dumpModelAsXml(context, def);
-
-        // if resolving placeholders we parse the xml, and resolve the property placeholders during parsing
-        if (resolvePlaceholders) {
-            final AtomicBoolean changed = new AtomicBoolean();
-            InputStream is = new ByteArrayInputStream(xml.getBytes("UTF-8"));
-            Document dom = XmlLineNumberParser.parseXml(is, text -> {
-                try {
-                    String after = getContext().resolvePropertyPlaceholders(text);
-                    if (!changed.get()) {
-                        changed.set(!text.equals(after));
-                    }
-                    return after;
-                } catch (Exception e) {
-                    // ignore
-                    return text;
-                }
-            });
-            // okay there were some property placeholder replaced so re-create the model
-            if (changed.get()) {
-                xml = context.getTypeConverter().mandatoryConvertTo(String.class, dom);
-                RestsDefinition copy = ModelHelper.createModelFromXml(context, xml, RestsDefinition.class);
-                xml = ecc.getModelToXMLDumper().dumpModelAsXml(context, copy);
-            }
-        }
 
-        return xml;
+        ExtendedCamelContext ecc = context.adapt(ExtendedCamelContext.class);
+        return ecc.getModelToXMLDumper().dumpModelAsXml(context, def, resolvePlaceholders, false);
     }
 
     @Override
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 0c53717..862f7f8 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
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.management.mbean;
 
+import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -51,8 +52,8 @@ import org.apache.camel.api.management.mbean.ManagedRouteMBean;
 import org.apache.camel.api.management.mbean.ManagedStepMBean;
 import org.apache.camel.api.management.mbean.RouteError;
 import org.apache.camel.model.Model;
-import org.apache.camel.model.ModelHelper;
 import org.apache.camel.model.RouteDefinition;
+import org.apache.camel.model.RoutesDefinition;
 import org.apache.camel.spi.InflightRepository;
 import org.apache.camel.spi.ManagementStrategy;
 import org.apache.camel.spi.RoutePolicy;
@@ -364,10 +365,13 @@ public class ManagedRoute extends ManagedPerformanceCounter implements TimerList
     @Override
     public void updateRouteFromXml(String xml) throws Exception {
         // convert to model from xml
-        RouteDefinition def = ModelHelper.createModelFromXml(context, xml, RouteDefinition.class);
-        if (def == null) {
+        ExtendedCamelContext ecc = context.adapt(ExtendedCamelContext.class);
+        InputStream is = context.getTypeConverter().convertTo(InputStream.class, xml);
+        RoutesDefinition routes = (RoutesDefinition) ecc.getXMLRoutesDefinitionLoader().loadRoutesDefinition(context, is);
+        if (routes == null || routes.getRoutes().isEmpty()) {
             return;
         }
+        RouteDefinition def = routes.getRoutes().get(0);
 
         // if the xml does not contain the route-id then we fix this by adding the actual route id
         // this may be needed if the route-id was auto-generated, as the intend is to update this route
diff --git a/core/camel-xml-io/src/main/java/org/apache/camel/xml/in/ModelParserXMLRoutesDefinitionLoader.java b/core/camel-xml-io/src/main/java/org/apache/camel/xml/in/ModelParserXMLRoutesDefinitionLoader.java
index 89f00b9..e166c52 100644
--- a/core/camel-xml-io/src/main/java/org/apache/camel/xml/in/ModelParserXMLRoutesDefinitionLoader.java
+++ b/core/camel-xml-io/src/main/java/org/apache/camel/xml/in/ModelParserXMLRoutesDefinitionLoader.java
@@ -19,6 +19,7 @@ package org.apache.camel.xml.in;
 import java.io.InputStream;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.NamedNode;
 import org.apache.camel.spi.XMLRoutesDefinitionLoader;
 
 /**
@@ -42,6 +43,11 @@ public class ModelParserXMLRoutesDefinitionLoader implements XMLRoutesDefinition
     }
 
     @Override
+    public <T extends NamedNode> T createModelFromXml(CamelContext context, String xml, Class<T> type) throws Exception {
+        throw new UnsupportedOperationException("Not support use camel-xml-jaxb instead");
+    }
+
+    @Override
     public String toString() {
         return "camel-xml-io";
     }
diff --git a/core/camel-xml-jaxb/src/main/java/org/apache/camel/xml/jaxb/JaxbModelToXMLDumper.java b/core/camel-xml-jaxb/src/main/java/org/apache/camel/xml/jaxb/JaxbModelToXMLDumper.java
index 6242445..518c4ae 100644
--- a/core/camel-xml-jaxb/src/main/java/org/apache/camel/xml/jaxb/JaxbModelToXMLDumper.java
+++ b/core/camel-xml-jaxb/src/main/java/org/apache/camel/xml/jaxb/JaxbModelToXMLDumper.java
@@ -41,7 +41,6 @@ import org.apache.camel.NamedNode;
 import org.apache.camel.TypeConversionException;
 import org.apache.camel.converter.jaxp.XmlConverter;
 import org.apache.camel.model.ExpressionNode;
-import org.apache.camel.model.ModelHelper;
 import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.model.RoutesDefinition;
 import org.apache.camel.model.language.ExpressionDefinition;
@@ -169,8 +168,8 @@ public class JaxbModelToXMLDumper implements ModelToXMLDumper {
             // replaced so re-create the model
             if (changed.get()) {
                 xml = context.getTypeConverter().mandatoryConvertTo(String.class, dom);
-                NamedNode copy = ModelHelper.createModelFromXml(context, xml, NamedNode.class);
                 ExtendedCamelContext ecc = context.adapt(ExtendedCamelContext.class);
+                NamedNode copy = ecc.getXMLRoutesDefinitionLoader().createModelFromXml(context, xml, NamedNode.class);
                 xml = ecc.getModelToXMLDumper().dumpModelAsXml(context, copy);
             }
         }
diff --git a/core/camel-xml-jaxb/src/main/java/org/apache/camel/xml/jaxb/JaxbXMLRoutesDefinitionLoader.java b/core/camel-xml-jaxb/src/main/java/org/apache/camel/xml/jaxb/JaxbXMLRoutesDefinitionLoader.java
index 208d5f8..1404e8a 100644
--- a/core/camel-xml-jaxb/src/main/java/org/apache/camel/xml/jaxb/JaxbXMLRoutesDefinitionLoader.java
+++ b/core/camel-xml-jaxb/src/main/java/org/apache/camel/xml/jaxb/JaxbXMLRoutesDefinitionLoader.java
@@ -24,11 +24,14 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Expression;
 import org.apache.camel.ExtendedCamelContext;
+import org.apache.camel.NamedNode;
+import org.apache.camel.TypeConversionException;
 import org.apache.camel.converter.jaxp.XmlConverter;
 import org.apache.camel.model.ExpressionNode;
 import org.apache.camel.model.RouteDefinition;
@@ -116,6 +119,11 @@ public class JaxbXMLRoutesDefinitionLoader implements XMLRoutesDefinitionLoader
     }
 
     @Override
+    public <T extends NamedNode> T createModelFromXml(CamelContext context, String xml, Class<T> type) throws Exception {
+        return modelToXml(context, null, xml, type);
+    }
+
+    @Override
     public String toString() {
         return "camel-xml-jaxb";
     }
@@ -191,4 +199,47 @@ public class JaxbXMLRoutesDefinitionLoader implements XMLRoutesDefinitionLoader
             }
         }
     }
+
+    private static <T extends NamedNode> T modelToXml(CamelContext context, InputStream is, String xml, Class<T> type) throws Exception {
+        JAXBContext jaxbContext = getJAXBContext(context);
+
+        XmlConverter xmlConverter = newXmlConverter(context);
+        Document dom = null;
+        try {
+            if (is != null) {
+                dom = xmlConverter.toDOMDocument(is, null);
+            } else if (xml != null) {
+                dom = xmlConverter.toDOMDocument(xml, null);
+            }
+        } catch (Exception e) {
+            throw new TypeConversionException(xml, Document.class, e);
+        }
+        if (dom == null) {
+            throw new IllegalArgumentException("InputStream and XML is both null");
+        }
+
+        Map<String, String> namespaces = new LinkedHashMap<>();
+        extractNamespaces(dom, namespaces);
+
+        Binder<Node> binder = jaxbContext.createBinder();
+        Object result = binder.unmarshal(dom);
+
+        if (result == null) {
+            throw new JAXBException("Cannot unmarshal to " + type + " using JAXB");
+        }
+
+        // Restore namespaces to anything that's NamespaceAware
+        if (result instanceof RoutesDefinition) {
+            List<RouteDefinition> routes = ((RoutesDefinition)result).getRoutes();
+            for (RouteDefinition route : routes) {
+                applyNamespaces(route, namespaces);
+            }
+        } else if (result instanceof RouteDefinition) {
+            RouteDefinition route = (RouteDefinition)result;
+            applyNamespaces(route, namespaces);
+        }
+
+        return type.cast(result);
+    }
+
 }
diff --git a/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide.adoc b/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide.adoc
index cac752a..793a646 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide.adoc
@@ -222,6 +222,11 @@ Should now be:
     exchange.setRollbackOnly(true);
 ----
 
+==== ModelHelper removed
+
+The class `org.apache.camel.model.ModelHelper` has been removed. Instead you can use its functionality from `ExtendedCamelContext` by
+the `getModelToXMLDumper` and `getXMLRoutesDefinitionLoader` methods which has APIs similar to `ModelHelper`.
+
 ==== camel-jaxp
 
 The class `org.apache.camel.processor.validation.PredicateValidatingProcessor` has moved from `camel-jaxp` JAR
diff --git a/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractLocalCamelController.java b/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractLocalCamelController.java
index 90a6ce1..a65b02b 100644
--- a/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractLocalCamelController.java
+++ b/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractLocalCamelController.java
@@ -39,7 +39,6 @@ import org.apache.camel.StatefulService;
 import org.apache.camel.api.management.ManagedCamelContext;
 import org.apache.camel.api.management.mbean.ManagedRouteMBean;
 import org.apache.camel.model.Model;
-import org.apache.camel.model.ModelHelper;
 import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.model.rest.RestDefinition;
 import org.apache.camel.model.rest.RestsDefinition;
@@ -394,7 +393,8 @@ public abstract class AbstractLocalCamelController extends AbstractCamelControll
             return null;
         }
 
-        return ModelHelper.dumpModelAsXml(context, route);
+        ExtendedCamelContext ecc = context.adapt(ExtendedCamelContext.class);
+        return ecc.getModelToXMLDumper().dumpModelAsXml(context, route);
     }
 
     @Override
@@ -459,7 +459,9 @@ public abstract class AbstractLocalCamelController extends AbstractCamelControll
         // use a rests definition to dump the rests
         RestsDefinition def = new RestsDefinition();
         def.setRests(rests);
-        return ModelHelper.dumpModelAsXml(context, def);
+
+        ExtendedCamelContext ecc = context.adapt(ExtendedCamelContext.class);
+        return ecc.getModelToXMLDumper().dumpModelAsXml(context, def);
     }
 
     @Override
diff --git a/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/DuplicateNamespacePrefixIssueTest.java b/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/DuplicateNamespacePrefixIssueTest.java
index 54f9871..8b1de84 100644
--- a/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/DuplicateNamespacePrefixIssueTest.java
+++ b/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/DuplicateNamespacePrefixIssueTest.java
@@ -20,10 +20,10 @@ import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.blueprint.BlueprintCamelContext;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.model.Model;
-import org.apache.camel.model.ModelHelper;
 import org.apache.camel.model.RoutesDefinition;
 import org.apache.camel.test.karaf.AbstractFeatureTest;
 import org.junit.Assert;
@@ -36,7 +36,6 @@ import org.ops4j.pax.exam.junit.PaxExam;
 /**
  * CAMEL-10817: dumpModelAsXml can return invalid XML namespace xmlns:xmlns
  */
-
 @RunWith(PaxExam.class)
 public class DuplicateNamespacePrefixIssueTest extends AbstractFeatureTest {
 
@@ -58,14 +57,15 @@ public class DuplicateNamespacePrefixIssueTest extends AbstractFeatureTest {
         });
 
         // Dump the model XML
-        String originalModelXML = ModelHelper.dumpModelAsXml(context, context.getExtension(Model.class).getRouteDefinition("foo"));
+        ExtendedCamelContext ecc = context.adapt(ExtendedCamelContext.class);
+        String originalModelXML = ecc.getModelToXMLDumper().dumpModelAsXml(context, context.getExtension(Model.class).getRouteDefinition("foo"));
 
         // Reload routes from dumped XML
         InputStream stream = new ByteArrayInputStream(originalModelXML.getBytes("UTF-8"));
-        RoutesDefinition routesDefinition = ModelHelper.loadRoutesDefinition(context, stream);
+        RoutesDefinition routesDefinition = (RoutesDefinition) ecc.getXMLRoutesDefinitionLoader().loadRoutesDefinition(context, stream);
 
         // Verify namespaces are as we expect
-        String modifiedModelXML = ModelHelper.dumpModelAsXml(context, routesDefinition);
+        String modifiedModelXML = ecc.getModelToXMLDumper().dumpModelAsXml(context, routesDefinition);
         String modifiedRoutesElementXML = modifiedModelXML.split("\n")[1];
         String expectedRoutesElementXML = "<routes xmlns=\"http://camel.apache.org/schema/spring\">";
         Assert.assertEquals(expectedRoutesElementXML, modifiedRoutesElementXML);
diff --git a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/RestDslXmlGenerator.java b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/RestDslXmlGenerator.java
index f139b61..63b66e0 100644
--- a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/RestDslXmlGenerator.java
+++ b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/RestDslXmlGenerator.java
@@ -27,6 +27,7 @@ import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 
+import org.apache.camel.ExtendedCamelContext;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
@@ -35,7 +36,6 @@ import org.xml.sax.InputSource;
 
 import io.apicurio.datamodels.openapi.models.OasDocument;
 import org.apache.camel.CamelContext;
-import org.apache.camel.model.ModelHelper;
 import org.apache.camel.model.rest.RestsDefinition;
 import org.apache.camel.util.ObjectHelper;
 
@@ -58,7 +58,8 @@ public class RestDslXmlGenerator extends RestDslGenerator<RestDslXmlGenerator> {
         openapi.paths.getPathItems().forEach(restDslStatement::visit);
 
         final RestsDefinition rests = emitter.result();
-        final String xml = ModelHelper.dumpModelAsXml(context, rests);
+        ExtendedCamelContext ecc = context.adapt(ExtendedCamelContext.class);
+        final String xml = ecc.getModelToXMLDumper().dumpModelAsXml(context, rests);
 
         final DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
         builderFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
diff --git a/tooling/swagger-rest-dsl-generator/src/main/java/org/apache/camel/generator/swagger/RestDslXmlGenerator.java b/tooling/swagger-rest-dsl-generator/src/main/java/org/apache/camel/generator/swagger/RestDslXmlGenerator.java
index c54d02e..62d43e6 100644
--- a/tooling/swagger-rest-dsl-generator/src/main/java/org/apache/camel/generator/swagger/RestDslXmlGenerator.java
+++ b/tooling/swagger-rest-dsl-generator/src/main/java/org/apache/camel/generator/swagger/RestDslXmlGenerator.java
@@ -27,6 +27,7 @@ import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 
+import org.apache.camel.ExtendedCamelContext;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
@@ -35,7 +36,6 @@ import org.xml.sax.InputSource;
 
 import io.swagger.models.Swagger;
 import org.apache.camel.CamelContext;
-import org.apache.camel.model.ModelHelper;
 import org.apache.camel.model.rest.RestsDefinition;
 import org.apache.camel.util.ObjectHelper;
 
@@ -56,7 +56,8 @@ public class RestDslXmlGenerator extends RestDslGenerator<RestDslXmlGenerator> {
         swagger.getPaths().forEach(restDslStatement::visit);
 
         final RestsDefinition rests = emitter.result();
-        final String xml = ModelHelper.dumpModelAsXml(context, rests);
+        ExtendedCamelContext ecc = context.adapt(ExtendedCamelContext.class);
+        final String xml = ecc.getModelToXMLDumper().dumpModelAsXml(context, rests);
 
         final DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
         builderFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);