You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fx-dev@ws.apache.org by ga...@apache.org on 2007/03/20 12:47:27 UTC

svn commit: r520369 - in /webservices/sandesha/trunk/java: config/ src/org/apache/sandesha2/ src/org/apache/sandesha2/handlers/ src/org/apache/sandesha2/msgprocessors/ src/org/apache/sandesha2/util/ src/org/apache/sandesha2/wsrm/ test/src/org/apache/sa...

Author: gatfora
Date: Tue Mar 20 04:47:25 2007
New Revision: 520369

URL: http://svn.apache.org/viewvc?view=rev&rev=520369
Log:
Mark the RMSBean as terminated if a SequenceUnknown or SequenceTerminated fault is returned from the RMD

Modified:
    webservices/sandesha/trunk/java/config/module.xml
    webservices/sandesha/trunk/java/src/org/apache/sandesha2/Sandesha2Constants.java
    webservices/sandesha/trunk/java/src/org/apache/sandesha2/handlers/SandeshaInHandler.java
    webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/CreateSeqMsgProcessor.java
    webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/FaultManager.java
    webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SpecSpecificConstants.java
    webservices/sandesha/trunk/java/src/org/apache/sandesha2/wsrm/FaultCode.java
    webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/faulttests/SequenceTerminatedFaultTest.java

Modified: webservices/sandesha/trunk/java/config/module.xml
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/config/module.xml?view=diff&rev=520369&r1=520368&r2=520369
==============================================================================
--- webservices/sandesha/trunk/java/config/module.xml (original)
+++ webservices/sandesha/trunk/java/config/module.xml Tue Mar 20 04:47:25 2007
@@ -43,10 +43,12 @@
         <actionMapping>http://schemas.xmlsoap.org/ws/2005/02/rm/SequenceAcknowledgement</actionMapping>
 
         <!-- namespaces for the 2007-02 spec -->
-        <actionMapping>http://docs.oasis-open.org/ws-rx/wsrm/200702/SequenceAcknowledgement</actionMapping>
-        
+        <actionMapping>http://docs.oasis-open.org/ws-rx/wsrm/200702/SequenceAcknowledgement</actionMapping>        
+        <actionMapping>http://docs.oasis-open.org/ws-rx/wsrm/200702/fault</actionMapping>
+
         <!--  For interoparability perposes. Some WSRM implementations tend to send this as the LastMessage -->
         <actionMapping>http://schemas.xmlsoap.org/ws/2005/02/rm/LastMessage</actionMapping>
+
      </operation>
  
      <operation name="RMInOutOperation" mep="http://www.w3.org/2006/01/wsdl/in-out">

Modified: webservices/sandesha/trunk/java/src/org/apache/sandesha2/Sandesha2Constants.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/Sandesha2Constants.java?view=diff&rev=520369&r1=520368&r2=520369
==============================================================================
--- webservices/sandesha/trunk/java/src/org/apache/sandesha2/Sandesha2Constants.java (original)
+++ webservices/sandesha/trunk/java/src/org/apache/sandesha2/Sandesha2Constants.java Tue Mar 20 04:47:25 2007
@@ -96,27 +96,29 @@
 		public interface Actions {
 			
 			// WS-RM actions
-			String ACTION_CREATE_SEQUENCE             = SPEC_2007_02.NS_URI + "/CreateSequence";
-			String ACTION_CREATE_SEQUENCE_RESPONSE    = SPEC_2007_02.NS_URI + "/CreateSequenceResponse";
-			String ACTION_CLOSE_SEQUENCE              = SPEC_2007_02.NS_URI + "/CloseSequence";
-			String ACTION_CLOSE_SEQUENCE_RESPONSE     = SPEC_2007_02.NS_URI + "/CloseSequenceResponse";
-			String ACTION_TERMINATE_SEQUENCE          = SPEC_2007_02.NS_URI + "/TerminateSequence";
-			String ACTION_TERMINATE_SEQUENCE_RESPONSE = SPEC_2007_02.NS_URI + "/TerminateSequenceResponse";
-			String ACTION_SEQUENCE_ACKNOWLEDGEMENT    = SPEC_2007_02.NS_URI + "/SequenceAcknowledgement";
-			String ACTION_ACK_REQUEST                 = SPEC_2007_02.NS_URI + "/AckRequested";
+			public static final String ACTION_CREATE_SEQUENCE             = SPEC_2007_02.NS_URI + "/CreateSequence";
+			public static final String ACTION_CREATE_SEQUENCE_RESPONSE    = SPEC_2007_02.NS_URI + "/CreateSequenceResponse";
+			public static final String ACTION_CLOSE_SEQUENCE              = SPEC_2007_02.NS_URI + "/CloseSequence";
+			public static final String ACTION_CLOSE_SEQUENCE_RESPONSE     = SPEC_2007_02.NS_URI + "/CloseSequenceResponse";
+			public static final String ACTION_TERMINATE_SEQUENCE          = SPEC_2007_02.NS_URI + "/TerminateSequence";
+			public static final String ACTION_TERMINATE_SEQUENCE_RESPONSE = SPEC_2007_02.NS_URI + "/TerminateSequenceResponse";
+			public static final String ACTION_SEQUENCE_ACKNOWLEDGEMENT    = SPEC_2007_02.NS_URI + "/SequenceAcknowledgement";
+			public static final String ACTION_ACK_REQUEST                 = SPEC_2007_02.NS_URI + "/AckRequested";
+			public static final String ACTION_FAULT                       = SPEC_2007_02.NS_URI + "/fault";
 			
 			// WS-MC actions
-			String ACTION_MAKE_CONNECTION             = SPEC_2007_02.MC_NS_URI + "/MakeConnection";
+			public static final String ACTION_MAKE_CONNECTION             = SPEC_2007_02.MC_NS_URI + "/MakeConnection";
 
-			String SOAP_ACTION_CREATE_SEQUENCE             = ACTION_CREATE_SEQUENCE;
-			String SOAP_ACTION_CREATE_SEQUENCE_RESPONSE    = ACTION_CREATE_SEQUENCE_RESPONSE;
-			String SOAP_ACTION_CLOSE_SEQUENCE              = ACTION_CLOSE_SEQUENCE;
-			String SOAP_ACTION_CLOSE_SEQUENCE_RESPONSE     = ACTION_CLOSE_SEQUENCE_RESPONSE;
-			String SOAP_ACTION_TERMINATE_SEQUENCE          = ACTION_TERMINATE_SEQUENCE;
-			String SOAP_ACTION_TERMINATE_SEQUENCE_RESPONSE = ACTION_TERMINATE_SEQUENCE_RESPONSE;
-			String SOAP_ACTION_SEQUENCE_ACKNOWLEDGEMENT    = ACTION_SEQUENCE_ACKNOWLEDGEMENT;
-			String SOAP_ACTION_ACK_REQUEST                 = ACTION_ACK_REQUEST;
-			String SOAP_ACTION_MAKE_CONNECTION             = ACTION_MAKE_CONNECTION;
+			public static final String SOAP_ACTION_CREATE_SEQUENCE             = ACTION_CREATE_SEQUENCE;
+			public static final String SOAP_ACTION_CREATE_SEQUENCE_RESPONSE    = ACTION_CREATE_SEQUENCE_RESPONSE;
+			public static final String SOAP_ACTION_CLOSE_SEQUENCE              = ACTION_CLOSE_SEQUENCE;
+			public static final String SOAP_ACTION_CLOSE_SEQUENCE_RESPONSE     = ACTION_CLOSE_SEQUENCE_RESPONSE;
+			public static final String SOAP_ACTION_TERMINATE_SEQUENCE          = ACTION_TERMINATE_SEQUENCE;
+			public static final String SOAP_ACTION_TERMINATE_SEQUENCE_RESPONSE = ACTION_TERMINATE_SEQUENCE_RESPONSE;
+			public static final String SOAP_ACTION_SEQUENCE_ACKNOWLEDGEMENT    = ACTION_SEQUENCE_ACKNOWLEDGEMENT;
+			public static final String SOAP_ACTION_ACK_REQUEST                 = ACTION_ACK_REQUEST;
+			public static final String SOAP_ACTION_MAKE_CONNECTION             = ACTION_MAKE_CONNECTION;
+			public static final String SOAP_ACTION_FAULT                       = ACTION_FAULT;
 		}
 		
 		public interface QNames {

Modified: webservices/sandesha/trunk/java/src/org/apache/sandesha2/handlers/SandeshaInHandler.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/handlers/SandeshaInHandler.java?view=diff&rev=520369&r1=520368&r2=520369
==============================================================================
--- webservices/sandesha/trunk/java/src/org/apache/sandesha2/handlers/SandeshaInHandler.java (original)
+++ webservices/sandesha/trunk/java/src/org/apache/sandesha2/handlers/SandeshaInHandler.java Tue Mar 20 04:47:25 2007
@@ -134,7 +134,8 @@
 			returnValue = seqProcessor.processSequenceHeader(rmMsgCtx);
 
 		} catch (Exception e) {
-			if (log.isDebugEnabled()) log.debug("SandeshaInHandler::invoke Exception caught during processInMessage", e);
+			if (log.isDebugEnabled()) 
+				log.debug("SandeshaInHandler::invoke Exception caught during processInMessage", e);
 			// message should not be sent in a exception situation.
 			msgCtx.pause();
 			returnValue = InvocationResponse.SUSPEND;
@@ -148,6 +149,10 @@
 					log.debug(message, e);
 				}
 			}
+			
+			// Rethrow the original exception if it is an AxisFault
+			if (e instanceof AxisFault)
+				throw (AxisFault)e;
 			
 			String message = SandeshaMessageHelper.getMessage(SandeshaMessageKeys.inMsgError, e.toString());
 			throw new AxisFault(message, e);

Modified: webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/CreateSeqMsgProcessor.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/CreateSeqMsgProcessor.java?view=diff&rev=520369&r1=520368&r2=520369
==============================================================================
--- webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/CreateSeqMsgProcessor.java (original)
+++ webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/CreateSeqMsgProcessor.java Tue Mar 20 04:47:25 2007
@@ -104,6 +104,35 @@
 				secManager.checkProofOfPossession(token, body, msgcontext);
 			}
 	
+			//if toAddress is RMAnon we may need to terminate the request side sequence here.
+			EndpointReference toEPR = createSeqMsg.getTo();
+			if (toEPR.hasAnonymousAddress()) {
+	
+				RMSBean findBean = new RMSBean ();
+				findBean.setReplyToEPR(toEPR.getAddress());
+				findBean.setTerminationPauserForCS(true);
+				
+				//TODO recheck
+				RMSBean rmsBean = storageManager.getRMSBeanMgr().findUnique(findBean);
+				if (rmsBean!=null) {					
+					//AckManager hs not done the termination. Do the termination here.
+					MessageContext requestSideRefMessage = storageManager.retrieveMessageContext(rmsBean.getReferenceMessageStoreKey(),context);
+					if (requestSideRefMessage==null) {
+						FaultManager.makeCreateSequenceRefusedFault(createSeqRMMsg, 
+								SandeshaMessageHelper.getMessage(SandeshaMessageKeys.referencedMessageNotFound, rmsBean.getInternalSequenceID()),
+								new Exception());						
+						// Return false if an Exception hasn't been thrown.
+						if (log.isDebugEnabled())
+							log.debug("Exit: CreateSeqMsgProcessor::processInMessage " + Boolean.FALSE);				
+						return false;
+					}
+					
+					RMMsgContext requestSideRefRMMessage = MsgInitializer.initializeMessage(requestSideRefMessage);
+					TerminateManager.addTerminateSequenceMessage(requestSideRefRMMessage, rmsBean.getInternalSequenceID(), rmsBean.getSequenceID(), storageManager);
+				}
+			}
+				
+
 			MessageContext outMessage = null;
 	
 			// Create the new sequence id, as well as establishing the beans that handle the
@@ -206,7 +235,6 @@
 			
 			// If the inbound sequence is targetted at the anonymous URI, we need to start
 			// polling for this sequence.
-			EndpointReference toEPR = createSeqMsg.getTo();
 			if (toEPR.hasAnonymousAddress()) {
 				if (Sandesha2Constants.SPEC_VERSIONS.v1_1.equals(createSeqRMMsg.getRMSpecVersion())) {
 					rmdBean.setPollingMode(true);
@@ -242,33 +270,6 @@
 	//		findBean.setName (Sandesha2Constants.SequenceProperties.TERMINATE_ON_CREATE_SEQUENCE);
 	//		findBean.setValue(createSeqMsg.getTo().getAddress());
 			
-			//if toAddress is RMAnon we may need to terminate the request side sequence here.
-			if (toEPR.hasAnonymousAddress()) {
-	
-				RMSBean findBean = new RMSBean ();
-				findBean.setReplyToEPR(toEPR.getAddress());
-				findBean.setTerminationPauserForCS(true);
-				
-				//TODO recheck
-				RMSBean rmsBean = storageManager.getRMSBeanMgr().findUnique(findBean);
-				if (rmsBean!=null) {					
-					//AckManager hs not done the termination. Do the termination here.
-					MessageContext requestSideRefMessage = storageManager.retrieveMessageContext(rmsBean.getReferenceMessageStoreKey(),context);
-					if (requestSideRefMessage==null) {
-						FaultManager.makeCreateSequenceRefusedFault(createSeqRMMsg, 
-								SandeshaMessageHelper.getMessage(SandeshaMessageKeys.referencedMessageNotFound, rmsBean.getInternalSequenceID()),
-								new Exception());						
-						// Return false if an Exception hasn't been thrown.
-						if (log.isDebugEnabled())
-							log.debug("Exit: CreateSeqMsgProcessor::processInMessage " + Boolean.FALSE);				
-						return false;
-					}
-					
-					RMMsgContext requestSideRefRMMessage = MsgInitializer.initializeMessage(requestSideRefMessage);
-					TerminateManager.addTerminateSequenceMessage(requestSideRefRMMessage, rmsBean.getInternalSequenceID(), rmsBean.getSequenceID(), storageManager);
-				}
-			}
-				
 			createSeqRMMsg.pause();
 		}
 		catch (Exception e) {

Modified: webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/FaultManager.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/FaultManager.java?view=diff&rev=520369&r1=520368&r2=520369
==============================================================================
--- webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/FaultManager.java (original)
+++ webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/FaultManager.java Tue Mar 20 04:47:25 2007
@@ -466,7 +466,11 @@
 			
 			referenceRMMsgContext.getMessageContext().getOperationContext().setProperty(
 					org.apache.axis2.Constants.RESPONSE_WRITTEN, Constants.VALUE_TRUE);
-
+						
+			// Set the action
+			faultMessageContext.setWSAAction(
+					SpecSpecificConstants.getAddressingFaultAction(referenceRMMsgContext.getRMSpecVersion()));
+			
 			if (log.isDebugEnabled())
 				log.debug("Sending fault message " + faultMessageContext.getEnvelope().getHeader());
 			// Send the message
@@ -479,6 +483,7 @@
 			throw new SandeshaException (message);
 		}
 		AxisFault fault = new AxisFault(faultColdValue.getTextAsQName(), data.getReason(), "", "", data.getDetail());
+	  fault.setFaultAction(SpecSpecificConstants.getAddressingFaultAction(referenceRMMsgContext.getRMSpecVersion()));
 		throw fault;		
 		
 	}
@@ -516,6 +521,7 @@
 		String SOAPNamespaceValue = factory.getSoapVersionURI();
 		
 		String soapFaultSubcode = null;
+		String identifier = null;
 		if (SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(SOAPNamespaceValue)) {
 			// Log the fault
 			if (faultPart.getCode() != null && 
@@ -530,15 +536,21 @@
 	      // If the sequence fault part is not null, then we have an RM specific fault.
 	      if (sequenceFault != null) {
 	      	soapFaultSubcode = sequenceFault.getFaultCode().getFaultCode();
+	      	
+	      	// Get the identifier - if there is one.
+	      	identifier = sequenceFault.getFaultCode().getDetail();
 	      }
       } catch (SandeshaException e) {
       	if (log.isDebugEnabled()) 
-      		log.debug("Unable to process SequenceFault");
+      		log.debug("Unable to process SequenceFault", e);
       }
 		}
 		
 		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) ) {
+			processSequenceUnknownFault(rmMsgCtx, fault, identifier);
 		}
 	}
 	
@@ -683,7 +695,52 @@
 		if (log.isDebugEnabled())
 			log.debug("Exit: FaultManager::processCreateSequenceRefusedFault");
 	}
-	
+
+	/**
+	 * If the RMD returns a SequenceTerminated, or an Unknown sequence fault, then we should 
+	 * mark the RMS Sequence as terminated and notify clients of the error.
+	 * 
+	 * @param rmMsgCtx
+	 * @param fault
+	 * @param identifier 
+	 */
+	private static void processSequenceUnknownFault(RMMsgContext rmMsgCtx, AxisFault fault, String sequenceID) throws AxisFault {
+		if (log.isDebugEnabled())
+			log.debug("Enter: FaultManager::processSequenceUnknownFault " + sequenceID);
+
+		ConfigurationContext configCtx = rmMsgCtx.getMessageContext().getConfigurationContext();
+
+		StorageManager storageManager = SandeshaUtil.getSandeshaStorageManager(configCtx, configCtx
+				.getAxisConfiguration());
+		
+		// Find the rmsBean
+		RMSBean rmsBean = SandeshaUtil.getRMSBeanFromSequenceId(storageManager, sequenceID);
+		if (rmsBean == null) {
+			if (log.isDebugEnabled())
+				log.debug("Exit: FaultManager::processSequenceUnknownFault Unable to find RMSBean");
+			return;
+		}
+
+		// Notify the clients of a failure
+		notifyClientsOfFault(rmsBean.getInternalSequenceID(), storageManager, configCtx, fault);
+		
+		rmMsgCtx.pause();
+		
+		// Cleanup sending side.
+		if (log.isDebugEnabled())
+			log.debug("Terminating sending sequence " + rmsBean);
+		TerminateManager.terminateSendingSide(rmsBean, storageManager);
+		
+		// Update the last activated time.
+		rmsBean.setLastActivatedTime(System.currentTimeMillis());
+		
+		// Update the bean in the map
+		storageManager.getRMSBeanMgr().update(rmsBean);
+
+		if (log.isDebugEnabled())
+			log.debug("Exit: FaultManager::processSequenceUnknownFault");	  
+  }
+
 	static void notifyClientsOfFault(String internalSequenceId, 
 			StorageManager storageManager, ConfigurationContext configCtx, AxisFault fault) throws SandeshaStorageException {
 		// Locate and update all of the messages for this sequence, now that we know

Modified: webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SpecSpecificConstants.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SpecSpecificConstants.java?view=diff&rev=520369&r1=520368&r2=520369
==============================================================================
--- webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SpecSpecificConstants.java (original)
+++ webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SpecSpecificConstants.java Tue Mar 20 04:47:25 2007
@@ -293,15 +293,15 @@
 					addressingNSURI));
 	}
 	
-	public static String getAddressingFaultAction (String addressingNSURI) throws SandeshaException {
-		if (AddressingConstants.Submission.WSA_NAMESPACE.equals(addressingNSURI))
-			return "http://docs.oasis-open.org/ws-rx/wsrm/200608/fault";  //this is not available in addressing constants )-:
-		else if (AddressingConstants.Final.WSA_NAMESPACE.equals(addressingNSURI))
+	public static String getAddressingFaultAction (String specVersion) throws SandeshaException {
+		if (Sandesha2Constants.SPEC_VERSIONS.v1_0.equals(specVersion)) 
 			return AddressingConstants.Final.WSA_FAULT_ACTION;
-		else
+		else if (Sandesha2Constants.SPEC_VERSIONS.v1_1.equals(specVersion)) 
+			return Sandesha2Constants.SPEC_2007_02.Actions.SOAP_ACTION_FAULT;
+		else 
 			throw new SandeshaException (SandeshaMessageHelper.getMessage(
-					SandeshaMessageKeys.unknownWSAVersion,
-					addressingNSURI));
+					SandeshaMessageKeys.unknownSpec,
+					specVersion));
 	}
 	
 	public static String getAddressingNamespace(String rmNamespace) throws SandeshaException {

Modified: webservices/sandesha/trunk/java/src/org/apache/sandesha2/wsrm/FaultCode.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/wsrm/FaultCode.java?view=diff&rev=520369&r1=520368&r2=520369
==============================================================================
--- webservices/sandesha/trunk/java/src/org/apache/sandesha2/wsrm/FaultCode.java (original)
+++ webservices/sandesha/trunk/java/src/org/apache/sandesha2/wsrm/FaultCode.java Tue Mar 20 04:47:25 2007
@@ -81,8 +81,16 @@
 		
 		this.faultCode = faultCodePart.getText();
 		
-		if (detailPart != null)
-			detail = detailPart.getText();
+		if (detailPart != null) {
+			detailOMElement = detailPart;
+			
+			OMElement identifier = detailPart
+				.getFirstChildWithName(new QName(namespaceValue, 
+						Sandesha2Constants.WSRM_COMMON.IDENTIFIER));
+			if (identifier != null) {
+				detail = identifier.getText();
+			}
+		}
 
 		return sequenceFault;
 

Modified: webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/faulttests/SequenceTerminatedFaultTest.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/faulttests/SequenceTerminatedFaultTest.java?view=diff&rev=520369&r1=520368&r2=520369
==============================================================================
--- webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/faulttests/SequenceTerminatedFaultTest.java (original)
+++ webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/faulttests/SequenceTerminatedFaultTest.java Tue Mar 20 04:47:25 2007
@@ -20,19 +20,28 @@
 import java.io.File;
 import java.io.OutputStream;
 import java.net.HttpURLConnection;
+import java.util.List;
 
 import javax.xml.namespace.QName;
 
+import org.apache.axiom.soap.SOAP12Constants;
 import org.apache.axiom.soap.SOAPEnvelope;
 import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.impl.llom.soap11.SOAP11Factory;
 import org.apache.axis2.addressing.AddressingConstants;
+import org.apache.axis2.addressing.EndpointReference;
+import org.apache.axis2.client.Options;
+import org.apache.axis2.client.ServiceClient;
 import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.context.ConfigurationContextFactory;
 import org.apache.axis2.context.MessageContext;
 import org.apache.axis2.description.AxisOperation;
 import org.apache.sandesha2.RMMsgContext;
 import org.apache.sandesha2.Sandesha2Constants;
 import org.apache.sandesha2.SandeshaTestCase;
+import org.apache.sandesha2.client.SandeshaClient;
+import org.apache.sandesha2.client.SandeshaClientConstants;
+import org.apache.sandesha2.client.SequenceReport;
 import org.apache.sandesha2.msgreceivers.RMMessageReceiver;
 import org.apache.sandesha2.storage.StorageManager;
 import org.apache.sandesha2.storage.Transaction;
@@ -263,6 +272,134 @@
 	}
 
 	/**
+	 * When sending application messages, if the RMD sequence returns a sequence terminated
+	 * fault, then the RMS Sequence should be terminated	 
+	 */
+	public void testRMSSequenceTerminatedOnSequenceTerminatedFault() throws Exception {
+		runSequenceTerminated(false, false);
+	}
+
+	/**
+	 * When sending application messages, if the RMD sequence returns a sequence terminated
+	 * fault, then the RMS Sequence should be terminated.
+	 * 
+	 * Runs at SOAP12 level	 
+	 */
+	public void testRMSSequenceTerminatedOnSequenceTerminatedFaultSOAP12() throws Exception {
+		runSequenceTerminated(false, true);
+	}
+
+	/**
+	 * When sending application messages, if the RMD sequence returns a sequence terminated
+	 * fault, then the RMS Sequence should be terminated	 
+	 */
+	public void testRMSSequenceTerminatedOnSequenceUnknownFault() throws Exception {		
+		runSequenceTerminated(true, false);
+	}
+
+	/**
+	 * When sending application messages, if the RMD sequence returns a sequence terminated
+	 * fault, then the RMS Sequence should be terminated	 
+	 * 
+	 * Runs at SOAP12 level	 
+	 */
+	public void testRMSSequenceTerminatedOnSequenceUnknownFaultSOAP12() throws Exception {	
+		org.apache.log4j.BasicConfigurator.configure();
+		runSequenceTerminated(true, true);
+	}
+
+	private void runSequenceTerminated(boolean deleteRMSBean, boolean soap12) throws Exception {
+		String to = "http://127.0.0.1:" + serverPort + "/axis2/services/RMSampleService";
+		
+		String repoPath = "target" + File.separator + "repos" + File.separator + "client";
+		String axis2_xml = "target" + File.separator + "repos" + File.separator + "client" + File.separator + "client_axis2.xml";
+		
+		ConfigurationContext configContext = ConfigurationContextFactory.createConfigurationContextFromFileSystem(repoPath,axis2_xml);		
+		
+		Options clientOptions = new Options ();
+		clientOptions.setAction(pingAction);
+		clientOptions.setTo(new EndpointReference (to));
+
+		String sequenceKey = SandeshaUtil.getUUID();
+		clientOptions.setProperty(SandeshaClientConstants.SEQUENCE_KEY,sequenceKey);
+		clientOptions.setProperty(SandeshaClientConstants.RM_SPEC_VERSION,Sandesha2Constants.SPEC_VERSIONS.v1_1);
+		
+		if (soap12)
+			clientOptions.setSoapVersionURI(SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI);
+		
+		ServiceClient serviceClient = new ServiceClient (configContext,null);
+		serviceClient.setOptions(clientOptions);
+
+    // Send a single ping message
+		serviceClient.fireAndForget(getPingOMBlock("ping1"));
+	
+		long limit = System.currentTimeMillis() + waitTime;
+		Error lastError = null;
+		while(System.currentTimeMillis() < limit) {
+			Thread.sleep(tickTime); // Try the assertions each tick interval, until they pass or we time out
+			
+			// Check that the sequence has been deleted.
+			StorageManager storageManager = 
+				SandeshaUtil.getSandeshaStorageManager(serverConfigContext, serverConfigContext.getAxisConfiguration());
+			
+			Transaction tran = storageManager.getTransaction();
+			
+			RMDBean finderBean = new RMDBean();
+			List rmdBeans = storageManager.getRMDBeanMgr().find(finderBean);
+			
+			tran.commit();
+			
+			lastError = null;
+			
+			if (rmdBeans.isEmpty())
+				lastError = new Error("rmdBeans empty " + rmdBeans);
+			else {
+				RMDBean bean = (RMDBean)rmdBeans.get(0);
+				if (!bean.getServerCompletedMessages().getContainedElementsAsNumbersList().contains(new Integer(1))) {
+					tran = storageManager.getTransaction();
+					if (deleteRMSBean) {
+						storageManager.getRMDBeanMgr().delete(bean.getSequenceID());
+					} else {
+						bean.setTerminated(true);
+						storageManager.getRMDBeanMgr().update(bean);
+					}
+					tran.commit();
+					break;				
+				}
+				
+				lastError = new Error("App message has not arrived");
+			}
+		}
+
+		if(lastError != null) throw lastError;
+
+		// Send a second application message.
+		serviceClient.fireAndForget(getPingOMBlock("ping2"));
+		
+		while(System.currentTimeMillis() < limit) {
+			Thread.sleep(tickTime); // Try the assertions each tick interval, until they pass or we time out
+			
+			try {
+        //Check that the outgoing sequence is terminated
+				SequenceReport sequenceReport = SandeshaClient.getOutgoingSequenceReport(serviceClient);
+				assertEquals(sequenceReport.getSequenceStatus(),SequenceReport.SEQUENCE_STATUS_TERMINATED);
+				assertEquals(sequenceReport.getSequenceDirection(),SequenceReport.SEQUENCE_DIRECTION_OUT);
+				
+				lastError = null;
+				break;
+			} catch(Error e) {
+				lastError = e;
+			}
+		}
+
+		if(lastError != null) throw lastError;
+		
+		configContext.getListenerManager().stop();
+		serviceClient.cleanup();
+
+	}
+	
+	/**
 	 * Get an application message as bytes
 	 * 
 	 * @return
@@ -410,4 +547,5 @@
 	}
 
 }
+
 



---------------------------------------------------------------------
To unsubscribe, e-mail: sandesha-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: sandesha-dev-help@ws.apache.org