public static void getOrSendFault()

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");
	}