use of org.w3c.dom.Node in project camel by apache.
the class CxfPayloadConverter method convertTo.
@SuppressWarnings("unchecked")
@FallbackConverter
public static <T> T convertTo(Class<T> type, Exchange exchange, Object value, TypeConverterRegistry registry) {
// CxfPayloads from other types
if (type.isAssignableFrom(CxfPayload.class)) {
try {
if (!value.getClass().isArray()) {
Source src = null;
// directly
if (value instanceof InputStream) {
src = new StreamSource((InputStream) value);
} else if (value instanceof Reader) {
src = new StreamSource((Reader) value);
} else if (value instanceof String) {
src = new StreamSource(new StringReader((String) value));
} else if (value instanceof Node) {
src = new DOMSource((Node) value);
} else if (value instanceof Source) {
src = (Source) value;
}
if (src == null) {
// assuming staxsource is preferred, otherwise use the
// one preferred
TypeConverter tc = registry.lookup(javax.xml.transform.stax.StAXSource.class, value.getClass());
if (tc == null) {
tc = registry.lookup(Source.class, value.getClass());
}
if (tc != null) {
src = tc.convertTo(Source.class, exchange, value);
}
}
if (src != null) {
return (T) sourceToCxfPayload(src, exchange);
}
}
TypeConverter tc = registry.lookup(NodeList.class, value.getClass());
if (tc != null) {
NodeList nodeList = tc.convertTo(NodeList.class, exchange, value);
return (T) nodeListToCxfPayload(nodeList, exchange);
}
tc = registry.lookup(Document.class, value.getClass());
if (tc != null) {
Document document = tc.convertTo(Document.class, exchange, value);
return (T) documentToCxfPayload(document, exchange);
}
// maybe we can convert via an InputStream
CxfPayload<?> p;
p = convertVia(InputStream.class, exchange, value, registry);
if (p != null) {
return (T) p;
}
// String is the converter of last resort
p = convertVia(String.class, exchange, value, registry);
if (p != null) {
return (T) p;
}
} catch (RuntimeCamelException e) {
// the internal conversion to XML can throw an exception if the content is not XML
// ignore this and return Void.TYPE to indicate that we cannot convert this
}
// no we could not do it currently
return (T) Void.TYPE;
}
// Convert a CxfPayload into something else
if (CxfPayload.class.isAssignableFrom(value.getClass())) {
CxfPayload<?> payload = (CxfPayload<?>) value;
int size = payload.getBodySources().size();
if (size == 1) {
if (type.isAssignableFrom(Document.class)) {
Source s = payload.getBodySources().get(0);
Document d;
try {
d = StaxUtils.read(s);
} catch (XMLStreamException e) {
throw new RuntimeException(e);
}
return type.cast(d);
}
// CAMEL-8410 Just make sure we get the Source object directly from the payload body source
Source s = payload.getBodySources().get(0);
if (type.isInstance(s)) {
return type.cast(s);
}
TypeConverter tc = registry.lookup(type, XMLStreamReader.class);
if (tc != null && (s instanceof StaxSource || s instanceof StAXSource)) {
XMLStreamReader r = (s instanceof StAXSource) ? ((StAXSource) s).getXMLStreamReader() : ((StaxSource) s).getXMLStreamReader();
if (payload.getNsMap() != null) {
r = new DelegatingXMLStreamReader(r, payload.getNsMap());
}
return tc.convertTo(type, exchange, r);
}
tc = registry.lookup(type, Source.class);
if (tc != null) {
XMLStreamReader r = null;
if (payload.getNsMap() != null) {
if (s instanceof StaxSource) {
r = ((StaxSource) s).getXMLStreamReader();
} else if (s instanceof StAXSource) {
r = ((StAXSource) s).getXMLStreamReader();
}
if (r != null) {
s = new StAXSource(new DelegatingXMLStreamReader(r, payload.getNsMap()));
}
}
return tc.convertTo(type, exchange, s);
}
}
TypeConverter tc = registry.lookup(type, NodeList.class);
if (tc != null) {
Object result = tc.convertTo(type, exchange, cxfPayloadToNodeList((CxfPayload<?>) value, exchange));
if (result == null) {
// no we could not do it currently, and we just abort the convert here
return (T) Void.TYPE;
} else {
return (T) result;
}
}
// we cannot convert a node list, so we try the first item from the
// node list
tc = registry.lookup(type, Node.class);
if (tc != null) {
NodeList nodeList = cxfPayloadToNodeList((CxfPayload<?>) value, exchange);
if (nodeList.getLength() > 0) {
return tc.convertTo(type, exchange, nodeList.item(0));
} else {
// no we could not do it currently
return (T) Void.TYPE;
}
} else {
if (size == 0) {
// empty size so we cannot convert
return (T) Void.TYPE;
}
}
}
return null;
}
use of org.w3c.dom.Node in project camel by apache.
the class AbstractCamelContextBeanDefinitionParser method doParse.
protected void doParse(Element element, ParserContext ctx, BeanDefinitionBuilder bean) {
// Parser the id attribute
bean.setAbstract(true);
// Parser the camelContextId attribute
final String camelContextId = element.getAttribute("camelContextId");
if (!StringUtils.isEmpty(camelContextId)) {
wireCamelContext(bean, getContextId(camelContextId));
// Don't need to do further parsing here
return;
}
NodeList children = element.getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
Node n = children.item(i);
if (n.getNodeType() == Node.ELEMENT_NODE) {
String name = n.getLocalName();
if ("camelContext".equals(name)) {
// Parser the camel context
BeanDefinition bd = ctx.getDelegate().parseCustomElement((Element) n);
// Get the inner camel context id
String contextId = (String) bd.getPropertyValues().getPropertyValue("id").getValue();
wireCamelContext(bean, getContextId(contextId));
} else if ("camelContextRef".equals(name)) {
String contextId = n.getTextContent();
wireCamelContext(bean, getContextId(contextId));
}
}
}
}
use of org.w3c.dom.Node in project camel by apache.
the class DefaultCxfBinding method getPayloadBodyElements.
protected static List<Source> getPayloadBodyElements(Message message, Map<String, String> nsMap) {
// take the namespace attribute from soap envelop
Map<String, String> bodyNC = CastUtils.cast((Map<?, ?>) message.get("soap.body.ns.context"));
if (bodyNC != null) {
// if there is no Node and the addNamespaceContext option is enabled, this map is available
nsMap.putAll(bodyNC);
} else {
Document soapEnv = (Document) message.getContent(Node.class);
if (soapEnv != null) {
NamedNodeMap attrs = soapEnv.getFirstChild().getAttributes();
for (int i = 0; i < attrs.getLength(); i++) {
Node node = attrs.item(i);
if (!node.getNodeValue().equals(Soap11.SOAP_NAMESPACE) && !node.getNodeValue().equals(Soap12.SOAP_NAMESPACE)) {
nsMap.put(node.getLocalName(), node.getNodeValue());
}
}
}
}
MessageContentsList inObjects = MessageContentsList.getContentsList(message);
if (inObjects == null) {
return new ArrayList<Source>(0);
}
org.apache.cxf.message.Exchange exchange = message.getExchange();
BindingOperationInfo boi = exchange.getBindingOperationInfo();
OperationInfo op = boi.getOperationInfo();
if (boi.isUnwrapped()) {
op = boi.getWrappedOperation().getOperationInfo();
}
List<MessagePartInfo> partInfos = null;
boolean client = Boolean.TRUE.equals(message.get(Message.REQUESTOR_ROLE));
if (client) {
// it is a response
partInfos = op.getOutput().getMessageParts();
} else {
// it is a request
partInfos = op.getInput().getMessageParts();
}
List<Source> answer = new ArrayList<Source>();
for (MessagePartInfo partInfo : partInfos) {
if (!inObjects.hasValue(partInfo)) {
continue;
}
Object part = inObjects.get(partInfo);
if (part instanceof Holder) {
part = ((Holder<?>) part).value;
}
if (part instanceof Source) {
Element element = null;
if (part instanceof DOMSource) {
element = getFirstElement(((DOMSource) part).getNode());
}
if (element != null) {
addNamespace(element, nsMap);
answer.add(new DOMSource(element));
} else {
answer.add((Source) part);
}
if (LOG.isTraceEnabled()) {
LOG.trace("Extract body element {}", element == null ? "null" : getXMLString(element));
}
} else if (part instanceof Element) {
addNamespace((Element) part, nsMap);
answer.add(new DOMSource((Element) part));
} else {
if (LOG.isDebugEnabled()) {
LOG.debug("Unhandled part type '{}'", part.getClass());
}
}
}
return answer;
}
use of org.w3c.dom.Node in project camel by apache.
the class ConverterTest method testFallbackConverter.
@Test
public void testFallbackConverter() throws Exception {
CamelContext context = new DefaultCamelContext();
Exchange exchange = new DefaultExchange(context);
MessageContentsList list = new MessageContentsList();
NodeListWrapper nl = new NodeListWrapper(new ArrayList<Element>());
list.add(nl);
exchange.getIn().setBody(list);
Node node = exchange.getIn().getBody(Node.class);
assertNull(node);
File file = new File("src/test/resources/org/apache/camel/component/cxf/converter/test.xml");
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.parse(file);
document.getDocumentElement().normalize();
List<Element> elements = new ArrayList<Element>();
elements.add(document.getDocumentElement());
nl = new NodeListWrapper(elements);
list.clear();
list.add(nl);
exchange.getIn().setBody(list);
node = exchange.getIn().getBody(Node.class);
assertNotNull(node);
}
use of org.w3c.dom.Node in project camel by apache.
the class CxfPayloadConverterTest method testCxfPayloadToNode.
@Test
public void testCxfPayloadToNode() {
// call the payload conversion that works
exchange.getIn().setBody(payload);
Node node = exchange.getIn().getBody(Node.class);
assertNotNull(node);
// do the empty conversion
exchange.getIn().setBody(emptyPayload);
node = exchange.getIn().getBody(Node.class);
assertNull(node);
// do the same one that worked before
exchange.getIn().setBody(payload);
node = exchange.getIn().getBody(Node.class);
assertNotNull(node);
// To make sure we always get the element here
Element root = (Element) node;
assertEquals("root element name", "root", root.getNodeName());
assertEquals("root element namespace", "http://www.test.org/foo", root.getNamespaceURI());
Element bar = (Element) root.getElementsByTagName("bar").item(0);
assertEquals("child element name", "bar", bar.getNodeName());
assertEquals("child element namespace", "http://www.test.org/foo", bar.getNamespaceURI());
}
Aggregations