public static <T> T convertTo(Class<T> type, Exchange exchange, Object value, TypeConverterRegistry registry) {
// use fallback type converter, so we can probably convert into
// CxfPayloads from other types
if (type.isAssignableFrom(CxfPayload.class)) {
if (!value.getClass().isArray()) {
TypeConverter tc = registry.lookup(Source.class, value.getClass());
if (tc != null) {
Source src = tc.convertTo(Source.class, exchange, value);
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;
}
// 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;
if (payload.getBodySources().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);
}
payload.getBodySources().set(0, new DOMSource(d.getDocumentElement()));
return type.cast(d);
}
TypeConverter tc = registry.lookup(type, Source.class);
if (tc != null) {
Source s = payload.getBodySources().get(0);
if (type.isInstance(s)) {
return type.cast(s);
}
if ((s instanceof StreamSource
|| s instanceof SAXSource)
&& !type.isAssignableFrom(Document.class)
&& !type.isAssignableFrom(Source.class)) {
//non-reproducible sources, we need to convert to DOMSource first
//or the payload will get wiped out
Document d;
try {
d = StaxUtils.read(s);
} catch (XMLStreamException e) {
throw new RuntimeException(e);
}
s = new DOMSource(d.getDocumentElement());
payload.getBodySources().set(0, s);
}
T t = tc.convertTo(type, s);
if (t instanceof Document) {
payload.getBodySources().set(0, new DOMSource(((Document)t).getDocumentElement()));
} else if (t instanceof Source) {
payload.getBodySources().set(0, (Source)t);
}
return t;
}
}
TypeConverter tc = registry.lookup(type, NodeList.class);
if (tc != null) {
Object result = tc.convertTo(type, 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, nodeList.item(0));
} else {
// no we could not do it currently
return (T) Void.TYPE;
}
}