Map<String, Object> rmReqProps = (Map<String, Object>)msgContext.get(RMConstant.REQUEST_CONTEXT);
msgContext.remove(RMConstant.REQUEST_CONTEXT);
if (rmReqProps == null)
{
throw new RMFault(RMFaultCode.WSRM_REQUIRED);
}
AddressingProperties addrProps = (AddressingProperties)msgContext.get(JAXWSAConstants.SERVER_ADDRESSING_PROPERTIES_INBOUND);
if (addrProps == null)
{
throw new IllegalStateException("WS-Addressing properties not found in server request");
}
List<QName> protocolMessages = new LinkedList<QName>();
Map<String, Object> rmResponseContext = new HashMap<String, Object>();
rmResponseContext.put(RMConstant.PROTOCOL_MESSAGES, protocolMessages);
msgContext.remove(RMConstant.RESPONSE_CONTEXT);
RMServerSequence sequence = null;
boolean isOneWayOperation = true;
if (RMHelper.isCreateSequence(rmReqProps))
{
sequence = new RMServerSequence();
RMStore.serialize(dataDir, sequence);
protocolMessages.add(rmConstants.getCreateSequenceResponseQName());
rmResponseContext.put(RMConstant.SEQUENCE_REFERENCE, sequence);
isOneWayOperation = false;
}
if (RMHelper.isCloseSequence(rmReqProps))
{
Map<QName, RMSerializable> data = (Map<QName, RMSerializable>)rmReqProps.get(RMConstant.PROTOCOL_MESSAGES_MAPPING);
RMCloseSequence payload = (RMCloseSequence)data.get(rmConstants.getCloseSequenceQName());
String seqIdentifier = payload.getIdentifier();
sequence = RMStore.deserialize(dataDir, seqIdentifier, true);
if (sequence == null)
{
throw getUnknownSequenceFault(seqIdentifier);
}
sequence.close();
RMStore.serialize(dataDir, sequence);
protocolMessages.add(rmConstants.getCloseSequenceResponseQName());
protocolMessages.add(rmConstants.getSequenceAcknowledgementQName());
rmResponseContext.put(RMConstant.SEQUENCE_REFERENCE, sequence);
isOneWayOperation = false;
}
if (RMHelper.isSequenceAcknowledgement(rmReqProps))
{
Map<QName, RMSerializable> data = (Map<QName, RMSerializable>)rmReqProps.get(RMConstant.PROTOCOL_MESSAGES_MAPPING);
RMSequenceAcknowledgement payload = (RMSequenceAcknowledgement)data.get(rmConstants.getSequenceAcknowledgementQName());
String seqIdentifier = payload.getIdentifier();
sequence = RMStore.deserialize(dataDir, seqIdentifier, false);
if (sequence == null)
{
throw getUnknownSequenceFault(seqIdentifier);
}
for (RMSequenceAcknowledgement.RMAcknowledgementRange range : payload.getAcknowledgementRanges())
{
for (long i = range.getLower(); i <= range.getUpper(); i++)
{
if (i > sequence.getLastMessageNumber())
{
// invalid acknowledgement - generating fault
RMStore.serialize(dataDir, sequence);
Map<String, Object> detailsMap = new HashMap<String, Object>(2);
detailsMap.put(RMFaultConstant.ACKNOWLEDGEMENT, range);
throw new RMFault(RMFaultCode.INVALID_ACKNOWLEDGEMENT, new HashMap<String, Object>(2));
}
sequence.addReceivedOutboundMessage(i);
}
}