public static void checkAndTerminate()

in modules/core/src/main/java/org/apache/sandesha2/util/TerminateManager.java [70:134]


	public static void checkAndTerminate(ConfigurationContext configurationContext, StorageManager storageManager, RMSBean rmsBean)
	throws SandeshaStorageException, AxisFault {
		if(LoggingControl.isAnyTracingEnabled() && log.isDebugEnabled()) log.debug("Enter: TerminateManager::checkAndTerminate " +rmsBean);

		long lastOutMessage = rmsBean.getLastOutMessage ();

		if (lastOutMessage > 0 && !rmsBean.isTerminateAdded()) {
			
			boolean complete = AcknowledgementManager.verifySequenceCompletion(rmsBean.getClientCompletedMessages(), lastOutMessage);
			
			//If this is RM 1.1 and RMAnonURI scenario, dont do the termination unless the response side createSequence has been
			//received (RMDBean has been created) through polling, in this case termination will happen in the create sequence response processor.
			String rmVersion = rmsBean.getRMVersion();
			EndpointReference replyTo = rmsBean.getReplyToEndpointReference();

			if (complete &&
					Sandesha2Constants.SPEC_VERSIONS.v1_1.equals(rmVersion) && replyTo!=null && SandeshaUtil.isWSRMAnonymous(replyTo.getAddress())) {
				RMDBean findBean = new RMDBean ();
				findBean.setPollingMode(true);
				findBean.setToEndpointReference(replyTo);

				RMDBeanMgr rmdBeanMgr = storageManager.getRMDBeanMgr();
				List<RMDBean> beans = rmdBeanMgr.find(findBean);
				if(beans.isEmpty()) {
					rmsBean.setTerminationPauserForCS(true);
					storageManager.getRMSBeanMgr().update(rmsBean);
					complete = false;
				}
			}
			
			// If we are doing sync 2-way over WSRM 1.0 then we may need to keep sending messages,
			// so check to see if all the senders have been removed
			if (complete &&
					Sandesha2Constants.SPEC_VERSIONS.v1_0.equals(rmVersion) && (replyTo==null || replyTo.hasAnonymousAddress())) {
				SenderBean matcher = new SenderBean();
				matcher.setMessageType(Sandesha2Constants.MessageTypes.APPLICATION);
				matcher.setSequenceID(rmsBean.getSequenceID());
				
				List<SenderBean> matches = storageManager.getSenderBeanMgr().find(matcher);
				if(!matches.isEmpty()) complete = false;
			}
			
			if (complete) {
				
				String referenceMsgKey = rmsBean.getReferenceMessageStoreKey();
				if (referenceMsgKey==null) {
					String message = SandeshaMessageHelper.getMessage(SandeshaMessageKeys.referenceMessageNotSetForSequence,rmsBean.getSequenceID());
					throw new SandeshaException (message);
				}
				
				MessageContext referenceMessage = storageManager.retrieveMessageContext(referenceMsgKey, configurationContext);
				
				if (referenceMessage==null) {
					String message = SandeshaMessageHelper.getMessage(SandeshaMessageKeys.referencedMessageNotFound, rmsBean.getSequenceID());
					throw new SandeshaException (message);
				}
				
				RMMsgContext referenceRMMsg = MsgInitializer.initializeMessage(referenceMessage);
				addTerminateSequenceMessage(referenceRMMsg, rmsBean.getInternalSequenceID(), rmsBean.getSequenceID(), storageManager);
			}
			
		}

		if(LoggingControl.isAnyTracingEnabled() && log.isDebugEnabled()) log.debug("Exit: TerminateManager::checkAndTerminate");
	}