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
The following commit(s) were added to refs/heads/master by this push: new cc9eb90 api: remove createModelFromXml from XMLRoutesDefinitionLoader (#4986) cc9eb90 is described below commit cc9eb90e54c2afcd7513741c5b322aab2238d777 Author: Luca Burgazzoli <lburgazz...@users.noreply.github.com> AuthorDate: Mon Feb 1 18:16:18 2021 +0100 api: remove createModelFromXml from XMLRoutesDefinitionLoader (#4986) --- .../camel/spi/XMLRoutesDefinitionLoader.java | 7 - .../in/ModelParserXMLRoutesDefinitionLoader.java | 6 - ...RoutesDefinitionLoader.java => JaxbHelper.java} | 178 ++++----------------- .../camel/xml/jaxb/JaxbModelToXMLDumper.java | 77 +-------- .../xml/jaxb/JaxbXMLRoutesDefinitionLoader.java | 145 +---------------- 5 files changed, 47 insertions(+), 366 deletions(-) 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 56c2259..581025e 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,7 +19,6 @@ 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. @@ -45,10 +44,4 @@ public interface XMLRoutesDefinitionLoader { * Loads from XML into rests. */ 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-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 3288af8..fcdcfe9 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,7 +19,6 @@ 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; import org.apache.camel.spi.annotations.JdkService; @@ -51,11 +50,6 @@ 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 supported 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/JaxbXMLRoutesDefinitionLoader.java b/core/camel-xml-jaxb/src/main/java/org/apache/camel/xml/jaxb/JaxbHelper.java similarity index 51% copy from core/camel-xml-jaxb/src/main/java/org/apache/camel/xml/jaxb/JaxbXMLRoutesDefinitionLoader.java copy to core/camel-xml-jaxb/src/main/java/org/apache/camel/xml/jaxb/JaxbHelper.java index c32a949..de2b2a1 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/JaxbHelper.java @@ -16,8 +16,6 @@ */ package org.apache.camel.xml.jaxb; -import java.io.IOException; -import java.io.InputStream; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; @@ -26,7 +24,6 @@ import java.util.Map; import javax.xml.bind.Binder; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; @@ -44,136 +41,51 @@ import org.apache.camel.model.RouteTemplateDefinition; import org.apache.camel.model.RouteTemplatesDefinition; import org.apache.camel.model.RoutesDefinition; import org.apache.camel.model.language.ExpressionDefinition; -import org.apache.camel.model.rest.RestDefinition; -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.spi.XMLRoutesDefinitionLoader; -import org.apache.camel.spi.annotations.JdkService; import static org.apache.camel.model.ProcessorDefinitionHelper.filterTypeInOutputs; -/** - * JAXB based {@link XMLRoutesDefinitionLoader}. This is the default loader used historically by Camel. The camel-xml-io - * parser is a light-weight alternative. - */ -@JdkService(XMLRoutesDefinitionLoader.FACTORY) -public class JaxbXMLRoutesDefinitionLoader implements XMLRoutesDefinitionLoader { - - @Override - public Object loadRoutesDefinition(CamelContext context, InputStream inputStream) throws Exception { - XmlConverter xmlConverter = newXmlConverter(context); - Document dom = xmlConverter.toDOMDocument(inputStream, null); - - JAXBContext jaxbContext = getJAXBContext(context); - - 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 RoutesDefinition using JAXB"); - } - - // can either be routes or a single route - RoutesDefinition answer; - if (result instanceof RouteDefinition) { - RouteDefinition route = (RouteDefinition) result; - answer = new RoutesDefinition(); - applyNamespaces(route, namespaces); - answer.getRoutes().add(route); - } else if (result instanceof RoutesDefinition) { - answer = (RoutesDefinition) result; - for (RouteDefinition route : answer.getRoutes()) { - applyNamespaces(route, namespaces); - } - } else { - // ignore not supported type - return null; - } - - return answer; +public final class JaxbHelper { + private JaxbHelper() { } - @Override - public Object loadRouteTemplatesDefinition(CamelContext context, InputStream inputStream) throws Exception { - XmlConverter xmlConverter = newXmlConverter(context); - Document dom = xmlConverter.toDOMDocument(inputStream, null); - - JAXBContext jaxbContext = getJAXBContext(context); - - Map<String, String> namespaces = new LinkedHashMap<>(); - extractNamespaces(dom, namespaces); - - Binder<Node> binder = jaxbContext.createBinder(); - Object result = binder.unmarshal(dom); + public static JAXBContext getJAXBContext(CamelContext context) throws Exception { + return (JAXBContext) context.adapt(ExtendedCamelContext.class).getModelJAXBContextFactory().newJAXBContext(); + } - if (result == null) { - throw new JAXBException("Cannot unmarshal to RouteTemplatesDefinition using JAXB"); - } + /** + * 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 + */ + public 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()); - // can either be routes or a single route - RouteTemplatesDefinition answer; - if (result instanceof RouteTemplateDefinition) { - RouteTemplateDefinition route = (RouteTemplateDefinition) result; - answer = new RouteTemplatesDefinition(); - applyNamespaces(route.getRoute(), namespaces); - answer.getRouteTemplates().add(route); - } else if (result instanceof RouteTemplatesDefinition) { - answer = (RouteTemplatesDefinition) result; - for (RouteTemplateDefinition route : answer.getRouteTemplates()) { - applyNamespaces(route.getRoute(), namespaces); + if (na != null) { + Map<String, String> map = na.getNamespaces(); + if (map != null && !map.isEmpty()) { + namespaces.putAll(map); + } } - } else { - // ignore not supported type - return null; } - - return answer; } - @Override - public Object loadRestsDefinition(CamelContext context, InputStream inputStream) throws Exception { - // load routes using JAXB - Unmarshaller unmarshaller = getJAXBContext(context).createUnmarshaller(); - Object result = unmarshaller.unmarshal(inputStream); - - if (result == null) { - throw new IOException("Cannot unmarshal to rests using JAXB from input stream: " + inputStream); - } + public static NamespaceAware getNamespaceAwareFromExpression(ExpressionNode expressionNode) { + ExpressionDefinition ed = expressionNode.getExpression(); - // can either be routes or a single route - RestsDefinition answer; - if (result instanceof RestDefinition) { - RestDefinition rest = (RestDefinition) result; - answer = new RestsDefinition(); - answer.getRests().add(rest); - } else if (result instanceof RestsDefinition) { - answer = (RestsDefinition) result; - } else { - // ignore not supported type - return null; + NamespaceAware na = null; + Expression exp = ed.getExpressionValue(); + if (exp instanceof NamespaceAware) { + na = (NamespaceAware) exp; + } else if (ed instanceof NamespaceAware) { + na = (NamespaceAware) ed; } - return answer; - } - - @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"; - } - - private static JAXBContext getJAXBContext(CamelContext context) throws Exception { - ModelJAXBContextFactory factory = context.adapt(ExtendedCamelContext.class).getModelJAXBContextFactory(); - return (JAXBContext) factory.newJAXBContext(); + return na; } /** @@ -182,7 +94,7 @@ public class JaxbXMLRoutesDefinitionLoader implements XMLRoutesDefinitionLoader * @param context CamelContext if provided * @return a new XmlConverter instance */ - private static XmlConverter newXmlConverter(CamelContext context) { + public static XmlConverter newXmlConverter(CamelContext context) { XmlConverter xmlConverter; if (context != null) { TypeConverterRegistry registry = context.getTypeConverterRegistry(); @@ -199,7 +111,7 @@ public class JaxbXMLRoutesDefinitionLoader implements XMLRoutesDefinitionLoader * @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 { + public 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); @@ -219,21 +131,7 @@ public class JaxbXMLRoutesDefinitionLoader implements XMLRoutesDefinitionLoader } } - 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; - } - - private static void applyNamespaces(RouteDefinition route, Map<String, String> namespaces) { + public 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()); @@ -243,18 +141,13 @@ public class JaxbXMLRoutesDefinitionLoader implements XMLRoutesDefinitionLoader } } - private static <T extends NamedNode> T modelToXml(CamelContext context, InputStream is, String xml, Class<T> type) - throws Exception { + public static <T extends NamedNode> T modelToXml(CamelContext context, String xml, Class<T> type) throws Exception { JAXBContext jaxbContext = getJAXBContext(context); XmlConverter xmlConverter = newXmlConverter(context); - Document dom = null; + Document dom; try { - if (is != null) { - dom = xmlConverter.toDOMDocument(is, null); - } else if (xml != null) { - dom = xmlConverter.toDOMDocument(xml, null); - } + dom = xmlConverter.toDOMDocument(xml, null); } catch (Exception e) { throw new TypeConversionException(xml, Document.class, e); } @@ -293,5 +186,4 @@ public class JaxbXMLRoutesDefinitionLoader implements XMLRoutesDefinitionLoader return type.cast(result); } - } 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 1f2e912..4f8fe6f 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 @@ -20,7 +20,6 @@ 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; @@ -38,25 +37,22 @@ import org.w3c.dom.Element; 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.ExpressionNode; import org.apache.camel.model.RouteDefinition; import org.apache.camel.model.RouteTemplateDefinition; import org.apache.camel.model.RouteTemplatesDefinition; import org.apache.camel.model.RoutesDefinition; -import org.apache.camel.model.language.ExpressionDefinition; -import org.apache.camel.spi.ModelJAXBContextFactory; import org.apache.camel.spi.ModelToXMLDumper; -import org.apache.camel.spi.NamespaceAware; -import org.apache.camel.spi.TypeConverterRegistry; import org.apache.camel.spi.annotations.JdkService; import org.apache.camel.util.xml.XmlLineNumberParser; -import static org.apache.camel.model.ProcessorDefinitionHelper.filterTypeInOutputs; +import static org.apache.camel.xml.jaxb.JaxbHelper.extractNamespaces; +import static org.apache.camel.xml.jaxb.JaxbHelper.getJAXBContext; +import static org.apache.camel.xml.jaxb.JaxbHelper.modelToXml; +import static org.apache.camel.xml.jaxb.JaxbHelper.newXmlConverter; /** * JAXB based {@link ModelToXMLDumper}. @@ -66,7 +62,7 @@ public class JaxbModelToXMLDumper implements ModelToXMLDumper { @Override public String dumpModelAsXml(CamelContext context, NamedNode definition) throws Exception { - JAXBContext jaxbContext = getJAXBContext(context); + final JAXBContext jaxbContext = getJAXBContext(context); final Map<String, String> namespaces = new LinkedHashMap<>(); // gather all namespaces from the routes or route which is stored on the @@ -134,9 +130,8 @@ public class JaxbModelToXMLDumper implements ModelToXMLDumper { // 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() { - + final InputStream is = new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8)); + final Document dom = XmlLineNumberParser.parseXml(is, new XmlLineNumberParser.XmlTextTransformer() { private String prev; @Override @@ -182,7 +177,7 @@ public class JaxbModelToXMLDumper implements ModelToXMLDumper { if (changed.get()) { xml = context.getTypeConverter().mandatoryConvertTo(String.class, dom); ExtendedCamelContext ecc = context.adapt(ExtendedCamelContext.class); - NamedNode copy = ecc.getXMLRoutesDefinitionLoader().createModelFromXml(context, xml, NamedNode.class); + NamedNode copy = modelToXml(context, xml, NamedNode.class); xml = ecc.getModelToXMLDumper().dumpModelAsXml(context, copy); } } @@ -190,60 +185,4 @@ public class JaxbModelToXMLDumper implements ModelToXMLDumper { return xml; } - private static JAXBContext getJAXBContext(CamelContext context) throws Exception { - ModelJAXBContextFactory factory = context.adapt(ExtendedCamelContext.class).getModelJAXBContextFactory(); - return (JAXBContext) factory.newJAXBContext(); - } - - /** - * 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); - } - } - } - } - - 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; - } - - /** - * 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-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 c32a949..a3c8113 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 @@ -18,9 +18,7 @@ package org.apache.camel.xml.jaxb; 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 javax.xml.bind.Binder; @@ -29,30 +27,23 @@ import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import org.w3c.dom.Document; -import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; 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; import org.apache.camel.model.RouteTemplateDefinition; import org.apache.camel.model.RouteTemplatesDefinition; import org.apache.camel.model.RoutesDefinition; -import org.apache.camel.model.language.ExpressionDefinition; import org.apache.camel.model.rest.RestDefinition; 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.spi.XMLRoutesDefinitionLoader; import org.apache.camel.spi.annotations.JdkService; -import static org.apache.camel.model.ProcessorDefinitionHelper.filterTypeInOutputs; +import static org.apache.camel.xml.jaxb.JaxbHelper.applyNamespaces; +import static org.apache.camel.xml.jaxb.JaxbHelper.extractNamespaces; +import static org.apache.camel.xml.jaxb.JaxbHelper.getJAXBContext; +import static org.apache.camel.xml.jaxb.JaxbHelper.newXmlConverter; /** * JAXB based {@link XMLRoutesDefinitionLoader}. This is the default loader used historically by Camel. The camel-xml-io @@ -162,136 +153,8 @@ 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"; } - private static JAXBContext getJAXBContext(CamelContext context) throws Exception { - ModelJAXBContextFactory factory = context.adapt(ExtendedCamelContext.class).getModelJAXBContextFactory(); - return (JAXBContext) factory.newJAXBContext(); - } - - /** - * 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; - } - - /** - * 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); - } - } - } - } - - 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; - } - - 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 <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 RouteTemplatesDefinition) { - List<RouteTemplateDefinition> templates = ((RouteTemplatesDefinition) result).getRouteTemplates(); - for (RouteTemplateDefinition template : templates) { - applyNamespaces(template.getRoute(), namespaces); - } - } else if (result instanceof RouteTemplateDefinition) { - RouteTemplateDefinition template = (RouteTemplateDefinition) result; - applyNamespaces(template.getRoute(), namespaces); - } else 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); - } - }