}
}
private void outResponse(final InOut jbiMex) {
final PartnerRoleMessageExchange outstanding = _outstandingExchanges.remove(jbiMex.getExchangeId());
if (outstanding == null) {
__log.warn("Received a response for unknown JBI message exchange " + jbiMex.getExchangeId());
return;
}
try {
_ode._scheduler.execTransaction(new Callable<Boolean>() {
@SuppressWarnings("unchecked")
public Boolean call() throws Exception {
// need to reload mex since we're in a different transaction
PartnerRoleMessageExchange pmex = (PartnerRoleMessageExchange) _ode._server.getEngine().getMessageExchange(outstanding.getMessageExchangeId());
if (pmex == null) {
__log.warn("Received a response for unknown partner role message exchange " + outstanding.getMessageExchangeId());
return Boolean.FALSE;
}
String mapperName = pmex.getProperty(Mapper.class.getName());
Mapper mapper = mapperName == null ? _ode.getDefaultMapper() : _ode.getMapper(mapperName);
if (mapper == null) {
String errmsg = "Mapper not found.";
__log.error(errmsg);
pmex.replyWithFailure(FailureType.FORMAT_ERROR, errmsg, null);
} else {
try {
Fault jbiFlt = jbiMex.getFault();
if (jbiFlt != null) {
javax.wsdl.Fault wsdlFlt = mapper.toFaultType(jbiFlt, (Collection<javax.wsdl.Fault>) pmex.getOperation().getFaults().values());
if (wsdlFlt == null) {
pmex.replyWithFailure(FailureType.FORMAT_ERROR, "Unrecognized fault message.", null);
} else {
if (wsdlFlt.getMessage() != null) {
Message faultResponse = pmex.createMessage(wsdlFlt.getMessage().getQName());
mapper.toODE(faultResponse, jbiFlt, wsdlFlt.getMessage());
pmex.replyWithFault(new QName(pmex.getPortType().getQName().getNamespaceURI(), wsdlFlt
.getName()), faultResponse);
} else {
// Can this even happen?
__log.fatal("Internal Error: fault found without a message type: " + wsdlFlt);
pmex.replyWithFailure(FailureType.FORMAT_ERROR, "Fault has no message: "
+ wsdlFlt.getName(), null);
}
}
} else {
Message response = pmex.createMessage(pmex.getOperation().getOutput().getMessage().getQName());
mapper.toODE(response, jbiMex.getOutMessage(), pmex.getOperation().getOutput().getMessage());
pmex.reply(response);
}
} catch (MessageTranslationException mte) {
__log.error("Error translating message.", mte);
pmex.replyWithFailure(FailureType.FORMAT_ERROR, mte.getMessage(), null);
}
}
return null;
}
});