in modules/core/src/main/java/org/apache/sandesha2/util/FaultManager.java [633:718]
private static InvocationResponse manageIncomingFault (AxisFault fault, RMMsgContext rmMsgCtx, SOAPFault faultPart, Transaction transaction) throws AxisFault {
if (log.isDebugEnabled())
log.debug("Enter: FaultManager::manageIncomingFault");
InvocationResponse response = InvocationResponse.CONTINUE;
if (log.isErrorEnabled())
log.error(fault);
SandeshaListener listner = (SandeshaListener) rmMsgCtx.getProperty(SandeshaClientConstants.SANDESHA_LISTENER);
if (listner!=null)
listner.onError(fault);
// Get the SOAPVersion
SOAPFactory factory = (SOAPFactory) rmMsgCtx.getSOAPEnvelope().getOMFactory();
String SOAPNamespaceValue = factory.getSoapVersionURI();
String soapFaultSubcode = null;
String identifier = null;
boolean isSOAP11SequenceUnknownFault = false;
if (SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(SOAPNamespaceValue)) {
// Need to get the sequence part from the Header.
if (log.isDebugEnabled())
log.debug("soap11");
// try {
SequenceFault sequenceFault = rmMsgCtx.getSequenceFault();
// If the sequence fault part is not null, then we have an RM specific fault.
if (sequenceFault != null) {
soapFaultSubcode = sequenceFault.getFaultCode().getFaultCode().getLocalPart();
// Get the identifier - if there is one.
identifier = sequenceFault.getFaultCode().getDetail();
isSOAP11SequenceUnknownFault = true;
if (log.isDebugEnabled())
log.debug("isSOAP11SequenceUnknownFault " + identifier);
}
// } catch (SandeshaException e) {
// if (log.isDebugEnabled())
// log.debug("Unable to process SequenceFault", e);
// }
}
// If we haven't found a soapFaultSubcode at this point - look inside the AxisFault for the information.
if (soapFaultSubcode == null && faultPart.getCode() != null &&
faultPart.getCode().getSubCode() != null &&
faultPart.getCode().getSubCode().getValue() != null)
soapFaultSubcode = faultPart.getCode().getSubCode().getValue().getTextAsQName().getLocalPart();
// Get the identifier, if there is one.
SOAPFaultDetail detail = faultPart.getDetail();
if (detail != null && !isSOAP11SequenceUnknownFault)
{
// At this point we may not know what RM NS is in use.
OMElement identifierOM = detail.getFirstChildWithName(new QName(Sandesha2Constants.SPEC_2005_02.NS_URI,
Sandesha2Constants.WSRM_COMMON.IDENTIFIER));
if (identifierOM != null){
identifier = identifierOM.getText();
}else{
identifierOM = detail.getFirstChildWithName(new QName(Sandesha2Constants.SPEC_2007_02.NS_URI,
Sandesha2Constants.WSRM_COMMON.IDENTIFIER));
if (identifierOM != null){
identifier = identifierOM.getText();
}
}
}
if (Sandesha2Constants.SOAPFaults.Subcodes.CREATE_SEQUENCE_REFUSED.equals(soapFaultSubcode)) {
processCreateSequenceRefusedFault(rmMsgCtx, fault);
} else if (Sandesha2Constants.SOAPFaults.Subcodes.UNKNOWN_SEQUENCE.equals(soapFaultSubcode) ||
Sandesha2Constants.SOAPFaults.Subcodes.SEQUENCE_TERMINATED.equals(soapFaultSubcode) ||
Sandesha2Constants.SOAPFaults.Subcodes.MESSAGE_NUMBER_ROLEOVER.equals(soapFaultSubcode)) {
processSequenceUnknownFault(rmMsgCtx, fault, identifier, transaction);
}
// If the operation is an Sandesha In Only operation, or the fault is a recognised fault,
// then stop the message from being processed further.
// To configure the actions for Sandesha to drop, add them to the module.xml under
// Sandesha2InOnly operation.
if (isRMFault(soapFaultSubcode))
response = InvocationResponse.ABORT;
if (log.isDebugEnabled())
log.debug("Exit: FaultManager::manageIncomingFault, " + response);
return response;
}