in modules/core/src/main/java/org/apache/sandesha2/util/FaultManager.java [507:612]
public static void getOrSendFault(RMMsgContext referenceRMMsgContext, FaultData data, boolean throwable, EndpointReference acksToEPR) throws AxisFault {
if (log.isDebugEnabled())
log.debug("Enter: FaultManager::getOrSendFault: " + referenceRMMsgContext + "," + data + "," + throwable + "," + acksToEPR);
SOAPFactory factory = (SOAPFactory) referenceRMMsgContext.getSOAPEnvelope().getOMFactory();
SOAPFaultCode faultCode = factory.createSOAPFaultCode();
faultCode.setValue(data.getCode());
if (factory.getSOAPVersion() == SOAP12Version.getSingleton()) {
SOAPFaultSubCode faultSubCode = factory.createSOAPFaultSubCode(faultCode);
faultSubCode.setValue(data.getSubcode());
}
SOAPFaultReason reason = factory.createSOAPFaultReason();
SOAPFaultDetail detail = factory.createSOAPFaultDetail();
detail.addDetailEntry(data.getDetail());
String SOAPNamespaceValue = factory.getSoapVersionURI();
if (SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(SOAPNamespaceValue))
{
SOAPFaultText reasonText = factory.createSOAPFaultText();
reasonText.setText(data.getReason());
reasonText.setLang(Sandesha2Constants.LANG_EN);
reason.addSOAPText(reasonText);
referenceRMMsgContext.setProperty(SOAP12Constants.SOAP_FAULT_CODE_LOCAL_NAME, faultCode);
referenceRMMsgContext.setProperty(SOAP12Constants.SOAP_FAULT_REASON_LOCAL_NAME, reason);
referenceRMMsgContext.setProperty(SOAP12Constants.SOAP_FAULT_DETAIL_LOCAL_NAME, detail);
AxisFault fault = new AxisFault(data.getCode(), data.getReason(), "", "", data.getDetail());
fault.setFaultAction(SpecSpecificConstants.getAddressingFaultAction(referenceRMMsgContext.getRMSpecVersion()));
//if this is throwable throwing it out, else we will log here.
if (throwable)
{
if (referenceRMMsgContext.getMessageContext().isServerSide()) {
if (log.isDebugEnabled())
log.debug("Exit: FaultManager::getOrSendFault: " + fault);
throw fault;
}
}
else
log.error("Sandesha2 got a fault when processing the message " + referenceRMMsgContext.getMessageId(), fault);
}
else if (SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals (SOAPNamespaceValue))
{
reason.setText(data.getReason());
referenceRMMsgContext.setProperty(SOAP11Constants.SOAP_FAULT_CODE_LOCAL_NAME, faultCode);
referenceRMMsgContext.setProperty(SOAP11Constants.SOAP_FAULT_DETAIL_LOCAL_NAME, detail);
referenceRMMsgContext.setProperty(SOAP11Constants.SOAP_FAULT_STRING_LOCAL_NAME, reason);
// Need to send this message as the Axis Layer doesn't set the "SequenceFault" header
MessageContext faultMessageContext =
MessageContextBuilder.createFaultMessageContext(referenceRMMsgContext.getMessageContext(), null);
if(acksToEPR!=null){
if (log.isDebugEnabled())
log.debug("Debug: FaultManager::getOrSendFault: rewrriting fault destination EPR to " + acksToEPR);
faultMessageContext.setTo(acksToEPR);
}
SOAPFaultEnvelopeCreator.addSOAPFaultEnvelope(faultMessageContext, Sandesha2Constants.SOAPVersion.v1_1, data, referenceRMMsgContext.getRMNamespaceValue());
// Set the action // TODO SET THE ACTION BASED ON THE SPEC
faultMessageContext.setWSAAction(
SpecSpecificConstants.getAddressingFaultAction(referenceRMMsgContext.getRMSpecVersion()));
if(throwable)
{
if (log.isDebugEnabled())
log.debug("Sending fault message " + faultMessageContext.getEnvelope().getHeader());
//Sending the message
//having a surrounded try block will make sure that the error is logged here
//and that this does not disturb the processing of a carrier message.
try {
AxisEngine.sendFault(faultMessageContext);
EndpointReference destination = faultMessageContext.getTo();
if(destination == null || destination.hasAnonymousAddress()) {
TransportUtils.setResponseWritten(referenceRMMsgContext.getMessageContext(), true);
}
} catch (Exception e) {
AxisFault fault = new AxisFault(data.getCode(), data.getReason(), "", "", data.getDetail());
String message = SandeshaMessageHelper.getMessage(SandeshaMessageKeys.couldNotSendFaultDueToException, fault.getMessage(), e.getMessage());
log.error(message);
}
}
else
{
AxisFault fault = new AxisFault(data.getCode(), data.getReason(), "", "", data.getDetail());
String message = SandeshaMessageHelper.getMessage(SandeshaMessageKeys.couldNotSendFaultDueToException, fault.getMessage());
log.error(message);
}
}
else
{
String message = SandeshaMessageHelper.getMessage(SandeshaMessageKeys.unknownSoapVersion);
throw new SandeshaException (message);
}
if (log.isDebugEnabled())
log.debug("Exit: FaultManager::getOrSendFault");
}