String createSeqMsgId = null;
if (relatesTo != null) {
createSeqMsgId = relatesTo.getValue();
} else {
// Work out the related message from the operation context
OperationContext context = createSeqResponseRMMsgCtx.getMessageContext().getOperationContext();
MessageContext createSeq = context.getMessageContext(WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
if(createSeq != null) createSeqMsgId = createSeq.getMessageID();
}
if(createSeqMsgId == null) {
String message = SandeshaMessageHelper.getMessage(SandeshaMessageKeys.relatesToNotAvailable);
log.error(message);
throw new SandeshaException(message);
}
SenderBeanMgr retransmitterMgr = storageManager.getSenderBeanMgr();
RMSBeanMgr rmsBeanMgr = storageManager.getRMSBeanMgr();
RMSBean rmsBean = rmsBeanMgr.retrieve(createSeqMsgId);
if (rmsBean == null) {
String message = SandeshaMessageHelper.getMessage(SandeshaMessageKeys.createSeqEntryNotFound);
log.debug(message);
throw new SandeshaException(message);
}
// Check that the create sequence response message proves possession of the correct token
String tokenData = rmsBean.getSecurityTokenData();
if(tokenData != null) {
SecurityManager secManager = SandeshaUtil.getSecurityManager(configCtx);
MessageContext crtSeqResponseCtx = createSeqResponseRMMsgCtx.getMessageContext();
OMElement body = crtSeqResponseCtx.getEnvelope().getBody();
SecurityToken token = secManager.recoverSecurityToken(tokenData);
secManager.checkProofOfPossession(token, body, crtSeqResponseCtx);
}
String internalSequenceId = rmsBean.getInternalSequenceID();
if (internalSequenceId == null || "".equals(internalSequenceId)) {
String message = SandeshaMessageHelper.getMessage(SandeshaMessageKeys.tempSeqIdNotSet);
log.debug(message);
throw new SandeshaException(message);
}
createSeqResponseRMMsgCtx.setProperty(Sandesha2Constants.MessageContextProperties.INTERNAL_SEQUENCE_ID,internalSequenceId);
// Check to see if we have already received a sequence id. If we have then this response is redundant,
// and we can forget about it.
// TODO: Should we terminate or close the extra sequence? We can only do that if the new sequence
// id is different from the one we got back the first time. For now it should be enough to just
// ignore it, and let it time out.
if(rmsBean.getSequenceID() != null) {
if(log.isDebugEnabled())
log.debug("Exit: CreateSeqResponseMsgProcessor::processInMessage, sequence id is already set. " +
"Existing id:" + rmsBean.getSequenceID() + ", new id:" + newOutSequenceId);
return false;
}
// Store the new sequence id
rmsBean.setSequenceID(newOutSequenceId);
// We should poll for any reply-to that uses the anonymous URI, when MakeConnection
// is enabled.
if (Sandesha2Constants.SPEC_VERSIONS.v1_1.equals(createSeqResponseRMMsgCtx.getRMSpecVersion())) {
SandeshaPolicyBean policy = SandeshaUtil.getPropertyBean(configCtx.getAxisConfiguration());
if(policy.isEnableMakeConnection()) {
String acksTo = rmsBean.getAcksToEPR();
EndpointReference reference = new EndpointReference(acksTo);
if(acksTo == null || reference.hasAnonymousAddress()) {
rmsBean.setPollingMode(true);
}
}
}
// deleting the create sequence sender bean entry.
retransmitterMgr.delete(createSeqMsgId);
// Remove the create sequence message
storageManager.removeMessageContext(rmsBean.getCreateSequenceMsgStoreKey());
// processing for accept (offer has been sent)
Accept accept = createSeqResponsePart.getAccept();
if (accept != null) {
// TODO this should be detected in the Fault manager.
if (rmsBean.getOfferedSequence() == null) {
String message = SandeshaMessageHelper.getMessage(SandeshaMessageKeys.accptButNoSequenceOffered);
log.debug(message);
throw new SandeshaException(message);
}
RMDBean rMDBean = new RMDBean();
EndpointReference acksToEPR = accept.getAcksTo().getEPR();
rMDBean.setAcksToEPR(acksToEPR.getAddress());
rMDBean.setSequenceID(rmsBean.getOfferedSequence());
rMDBean.setNextMsgNoToProcess(1);
rMDBean.setOutboundInternalSequence(rmsBean.getInternalSequenceID());
rMDBean.setServiceName(createSeqResponseRMMsgCtx.getMessageContext().getAxisService().getName());
//Storing the referenceMessage of the sending side sequence as the reference message
//of the receiving side as well.
//This can be used when creating new outgoing messages.
String referenceMsgStoreKey = rmsBean.getReferenceMessageStoreKey();
MessageContext referenceMsg = storageManager.retrieveMessageContext(referenceMsgStoreKey, configCtx);
String newMessageStoreKey = SandeshaUtil.getUUID();
storageManager.storeMessageContext(newMessageStoreKey,referenceMsg);
rMDBean.setReferenceMessageKey(newMessageStoreKey);
// If this is an offered sequence that needs polling then we need to setup the
// rmdBean for polling too, so that it still gets serviced after the outbound
// sequence terminates.
if (Sandesha2Constants.SPEC_VERSIONS.v1_1.equals(createSeqResponseRMMsgCtx.getRMSpecVersion())) {
if(rmsBean.isPollingMode()) {
rMDBean.setPollingMode(true);
}
}
String rmSpecVersion = createSeqResponseRMMsgCtx.getRMSpecVersion();
rMDBean.setRMVersion(rmSpecVersion);
EndpointReference toEPR = createSeqResponseRMMsgCtx.getTo();
if (toEPR==null) {
//Most probably this is a sync response message, using the replyTo of the request message
OperationContext operationContext = createSeqResponseRMMsgCtx.getMessageContext().getOperationContext();
if (operationContext!=null) {
MessageContext createSequnceMessage = operationContext.getMessageContext(WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
if (createSequnceMessage!=null)
toEPR = createSequnceMessage.getReplyTo();
}
}