public boolean processOutMessage(RMMsgContext rmMsgCtx) throws AxisFault {
if (log.isDebugEnabled())
log.debug("Enter: ApplicationMsgProcessor::processOutMessage");
MessageContext msgContext = rmMsgCtx.getMessageContext();
ConfigurationContext configContext = msgContext.getConfigurationContext();
//validating the outgoing message
MessageValidator.validateOutgoingMessage(rmMsgCtx);
// setting the Fault callback
SandeshaListener faultCallback = (SandeshaListener) msgContext.getOptions().getProperty(
SandeshaClientConstants.SANDESHA_LISTENER);
if (faultCallback != null) {
OperationContext operationContext = msgContext.getOperationContext();
if (operationContext != null) {
operationContext.setProperty(SandeshaClientConstants.SANDESHA_LISTENER, faultCallback);
}
}
StorageManager storageManager = SandeshaUtil.getSandeshaStorageManager(configContext, configContext
.getAxisConfiguration());
boolean serverSide = msgContext.isServerSide();
// setting message Id if null
if (msgContext.getMessageID() == null)
msgContext.setMessageID(SandeshaUtil.getUUID());
// find internal sequence id
String internalSequenceId = null;
String storageKey = SandeshaUtil.getUUID(); // the key which will be
// used to store this
// message.
/*
* Internal sequence id is the one used to refer to the sequence (since
* actual sequence id is not available when first msg arrives) server
* side - a derivation of the sequenceId of the incoming sequence client
* side - a derivation of wsaTo & SeequenceKey
*/
boolean lastMessage = false;
if (serverSide) {
if (inboundSequence == null || "".equals(inboundSequence)) {
String message = SandeshaMessageHelper.getMessage(SandeshaMessageKeys.incomingSequenceNotValidID, inboundSequence);
log.debug(message);
throw new SandeshaException(message);
}
internalSequenceId = SandeshaUtil.getOutgoingSideInternalSequenceID(inboundSequence);
} else {
// set the internal sequence id for the client side.
EndpointReference toEPR = msgContext.getTo();
if (toEPR == null || toEPR.getAddress() == null || "".equals(toEPR.getAddress())) {
String message = SandeshaMessageHelper.getMessage(SandeshaMessageKeys.toEPRNotValid, null);
log.debug(message);
throw new SandeshaException(message);
}
String to = toEPR.getAddress();
String sequenceKey = (String) msgContext.getProperty(SandeshaClientConstants.SEQUENCE_KEY);
internalSequenceId = SandeshaUtil.getInternalSequenceID(to, sequenceKey);
String lastAppMessage = (String) msgContext.getProperty(SandeshaClientConstants.LAST_MESSAGE);
if (lastAppMessage != null && "true".equals(lastAppMessage))
lastMessage = true;
}
if (internalSequenceId!=null)
rmMsgCtx.setProperty(Sandesha2Constants.MessageContextProperties.INTERNAL_SEQUENCE_ID,internalSequenceId);
/*
* checking weather the user has given the messageNumber (most of the
* cases this will not be the case where the system will generate the
* message numbers
*/
// User should set it as a long object.
Long messageNumberLng = (Long) msgContext.getProperty(SandeshaClientConstants.MESSAGE_NUMBER);
long givenMessageNumber = -1;
if (messageNumberLng != null) {
givenMessageNumber = messageNumberLng.longValue();
if (givenMessageNumber <= 0) {
throw new SandeshaException(SandeshaMessageHelper.getMessage(
SandeshaMessageKeys.msgNumberMustBeLargerThanZero, Long.toString(givenMessageNumber)));
}
}
// A dummy message is a one which will not be processed as a actual
// application message.
// The RM handlers will simply let these go.
String dummyMessageString = (String) msgContext.getOptions().getProperty(SandeshaClientConstants.DUMMY_MESSAGE);
boolean dummyMessage = false;
if (dummyMessageString != null && Sandesha2Constants.VALUE_TRUE.equals(dummyMessageString))
dummyMessage = true;
RMSBean rmsBean = SandeshaUtil.getRMSBeanFromInternalSequenceId(storageManager, internalSequenceId);
//see if the sequence is closed
if(rmsBean != null && rmsBean.isSequenceClosedClient()){
throw new SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.cannotSendMsgAsSequenceClosed, internalSequenceId));
}
//see if the sequence is terminated
if(rmsBean != null && rmsBean.isTerminateAdded()) {
throw new SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.cannotSendMsgAsSequenceTerminated, internalSequenceId));
}
//see if the sequence is timed out
if(rmsBean != null && rmsBean.isTimedOut()){
throw new SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.cannotSendMsgAsSequenceTimedout, internalSequenceId));
}
// If the call application is a 2-way MEP, and uses a anonymous replyTo, and the
// RM 1.1 spec level, then we must have MakeConnection enabled. We check that here,
// before we start creating a new Sequence.
if(!serverSide) {
AxisOperation op = msgContext.getAxisOperation();
int mep = WSDLConstants.MEP_CONSTANT_INVALID;
if(op != null) {
mep = op.getAxisSpecifMEPConstant();
}
if(mep == WSDLConstants.MEP_CONSTANT_OUT_IN) {
String specVersion = null;
if(rmsBean == null) {
specVersion = SequenceManager.getSpecVersion(msgContext, storageManager);
} else {
specVersion = rmsBean.getRMVersion();
}
if(specVersion == Sandesha2Constants.SPEC_VERSIONS.v1_1) {
SandeshaPolicyBean policy = SandeshaUtil.getPropertyBean(configContext.getAxisConfiguration());
if(!policy.isEnableMakeConnection()) {
String message = SandeshaMessageHelper.getMessage(SandeshaMessageKeys.makeConnectionDisabled);
throw new SandeshaException(message);
}
}