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 <[email protected]>
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);
- }
-
}