/** * Converts the inbound body to a {@link Source}, if the body is <b>not</b> already a {@link * Source}. * * <p>This implementation will prefer to source in the following order: * * <ul> * <li>StAX - If StAX is allowed * <li>SAX - SAX as 2nd choice * <li>Stream - Stream as 3rd choice * <li>DOM - DOM as 4th choice * </ul> */ protected Source getSource(Exchange exchange, Object body) { // body may already be a source if (body instanceof Source) { return (Source) body; } Source source = null; if (body != null) { if (isAllowStAX()) { // try StAX if enabled source = exchange.getContext().getTypeConverter().tryConvertTo(StAXSource.class, exchange, body); } if (source == null) { // then try SAX source = exchange.getContext().getTypeConverter().tryConvertTo(SAXSource.class, exchange, body); tryAddEntityResolver((SAXSource) source); } if (source == null) { // then try stream source = exchange .getContext() .getTypeConverter() .tryConvertTo(StreamSource.class, exchange, body); } if (source == null) { // and fallback to DOM source = exchange.getContext().getTypeConverter().tryConvertTo(DOMSource.class, exchange, body); } // as the TypeConverterRegistry will look up source the converter differently if the type // converter is loaded different // now we just put the call of source converter at last if (source == null) { TypeConverter tc = exchange.getContext().getTypeConverterRegistry().lookup(Source.class, body.getClass()); if (tc != null) { source = tc.convertTo(Source.class, exchange, body); } } } if (source == null) { if (isFailOnNullBody()) { throw new ExpectedBodyTypeException(exchange, Source.class); } else { try { source = converter.toDOMSource(converter.createDocument()); } catch (ParserConfigurationException e) { throw new RuntimeTransformException(e); } } } return source; }