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 <claus.ib...@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);