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 ja...@apache.org on 2004/09/13 13:25:22 UTC

cvs commit: ws-fx/sandesha/src/org/apache/sandesha/ws/rm/providers RMProvider.java

jaliya      2004/09/13 04:25:22

  Modified:    sandesha/src/org/apache/sandesha/ws/rm/providers
                        RMProvider.java
  Log:
  Formatted code
  
  Revision  Changes    Path
  1.19      +427 -481  ws-fx/sandesha/src/org/apache/sandesha/ws/rm/providers/RMProvider.java
  
  Index: RMProvider.java
  ===================================================================
  RCS file: /home/cvs/ws-fx/sandesha/src/org/apache/sandesha/ws/rm/providers/RMProvider.java,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- RMProvider.java	6 Jun 2004 07:11:03 -0000	1.18
  +++ RMProvider.java	13 Sep 2004 11:25:22 -0000	1.19
  @@ -16,6 +16,10 @@
    */
   package org.apache.sandesha.ws.rm.providers;
   
  +import java.util.List;
  +
  +import javax.xml.namespace.QName;
  +
   import org.apache.axis.AxisFault;
   import org.apache.axis.Message;
   import org.apache.axis.MessageContext;
  @@ -45,9 +49,6 @@
   import org.apache.sandesha.ws.rm.SequenceAcknowledgement;
   import org.apache.sandesha.ws.utility.Identifier;
   
  -import javax.xml.namespace.QName;
  -import java.util.List;
  -
   /**
    * class RMProvider
    * 
  @@ -57,486 +58,431 @@
    */
   
   public class RMProvider extends RPCProvider {
  -	/**
  -	 * Method processMessage
  -	 * 
  -	 * @param msgContext 
  -	 * @param reqEnv     
  -	 * @param resEnv     
  -	 * @param obj        
  -	 * @throws Exception 
  -	 */
  -
  -	public void processMessage(
  -		MessageContext msgContext,
  -		SOAPEnvelope reqEnv,
  -		SOAPEnvelope resEnv,
  -		Object obj)
  -		throws Exception {
  -
  -		if (!(isRmHeadersAvailable(msgContext)
  -			&& isAddressingHeadersAvailable(msgContext))) {
  -			throw new AxisFault("Insufficient Headers to Process Reliability.");
  -		} else {
  -			AddressingHeaders addressingHeaders =
  -				(AddressingHeaders) msgContext.getProperty(
  -					org
  -						.apache
  -						.axis
  -						.message
  -						.addressing
  -						.Constants
  -						.ENV_ADDRESSING_REQUEST_HEADERS);
  -			RMHeaders rmHeaders =
  -				(RMHeaders) msgContext.getProperty(
  -					org.apache.sandesha.Constants.ENV_RM_REQUEST_HEADERS);
  -
  -			boolean anonymousFrom = false;
  -			boolean anonymousReplyTo = false;
  -
  -			if (addressingHeaders.getFrom() != null) {
  -				if (addressingHeaders
  -					.getFrom()
  -					.getAddress()
  -					.toString()
  -					.equals(Constants.ANONYMOUS_URI)) {
  -					anonymousFrom = true;
  -				}
  -			}
  -
  -			if (addressingHeaders.getReplyTo() != null) {
  -				if (addressingHeaders
  -					.getReplyTo()
  -					.getAddress()
  -					.toString()
  -					.equals(Constants.ANONYMOUS_URI)) {
  -					anonymousReplyTo = true;
  -				}
  -			}
  -
  -			ServerMessageController serverMessageController =
  -				ServerMessageController.getInstance();
  -			ClientMessageController clientMessageController =
  -				ClientMessageController.getInstance();
  -
  -			Action action = addressingHeaders.getAction();
  -			String strAction = action.toString();
  -			//this returns something like "http://schemas.xmlsoap.org/ws/2004/03/rm/TerminateSequence" 
  -
  -			if (strAction.equals(Constants.ACTION_CREATE_SEQUENCE)) {
  -				//TODO:create the required env and send it to the source
  -
  -				if (!anonymousReplyTo) {
  -					//TODO:add the create seq flags
  -					////////////////////////////////////////////////////
  -					////////////////////////////////////////////////////
  -
  -					SOAPEnvelope envelope =
  -						createSequenceResponseEnvelope(addressingHeaders);
  -					//create the call
  -					Service service = new Service();
  -					Call call = (Call) service.createCall();
  -
  -					//get  the reply address
  -					ReplyTo replyTo = (ReplyTo) addressingHeaders.getReplyTo();
  -					URI replyToAddress = replyTo.getAddress();
  -					call.setTargetEndpointAddress(replyToAddress.toString());
  -
  -					RMHeaders createSeqRMHeadres = new RMHeaders();
  -					createSeqRMHeadres.fromSOAPEnvelope(envelope);
  -					RMSequence createSeq = new RMSequence();
  -					createSeq.setSequenceIdentifier(
  -						createSeqRMHeadres
  -							.getCreateSequenceResponse()
  -							.getIdentifier());
  -					createSeq.setClientDidReclamtion(true);
  -					serverMessageController.storeSequence(createSeq);
  -
  -					Message msg = new Message(envelope);
  -					call.setRequestMessage(msg);
  -
  -					//call.setReturnType(XMLType.AXIS_VOID);
  -
  -					//invoke
  -					call.invoke();
  -
  -					//disconnect http
  -					msgContext.setResponseMessage(null);
  -				} else {
  -
  -					//KEEP THE MESSAGE/////////////////////////////////////////
  -					//TODO:
  -
  -					SOAPEnvelope envelope =
  -						createSequenceResponseEnvelope(addressingHeaders);
  -					RMHeaders createSeqRMHeadres = new RMHeaders();
  -					createSeqRMHeadres.fromSOAPEnvelope(envelope);
  -					RMSequence createSeq = new RMSequence();
  -					createSeq.setSequenceIdentifier(
  -						createSeqRMHeadres
  -							.getCreateSequenceResponse()
  -							.getIdentifier());
  -					createSeq.setClientDidReclamtion(true);
  -					serverMessageController.storeSequence(createSeq);
  -					msgContext.setResponseMessage(new Message(envelope));
  -				}
  -
  -			} else if (
  -				strAction.equals(Constants.ACTION_CREATE_SEQUENCE_RESPONSE)) {
  -				//TODO:
  -
  -				createSequenceResponse(msgContext);
  -
  -			} else if (strAction.equals(Constants.ACTION_TERMINATE_SEQUENCE)) {
  -				//TODO:
  -				//
  -				terminateSequence(
  -					rmHeaders.getTerminateSequence().getIdentifier());
  -			} else {
  -				if (!anonymousFrom) {
  -					///TODO Check MessageInserter
  -					MessageInserter messageInserter =
  -						new MessageInserter(msgContext, obj);
  -					Thread thread = new Thread(messageInserter);
  -					thread.start();
  -					msgContext.setResponseMessage(null);
  -
  -				} else {
  -
  -					RMMessage message = new RMMessage();
  -
  -					message.setAddressingHeaders(addressingHeaders);
  -					message.setRMHeaders(rmHeaders);
  -					message.setRequestMessage(msgContext.getRequestMessage());
  -					msgContext.setEncodingStyle(msgContext.getEncodingStyle());
  -
  -					if (rmHeaders.getSequenceAcknowledgement() != null) {
  -
  -						Identifier seqAckID =
  -							rmHeaders
  -								.getSequenceAcknowledgement()
  -								.getIdentifier();
  -						RMSequence clientSeq =
  -							clientMessageController.retrieveIfSequenceExists(
  -								seqAckID);
  -						RMSequence serverSeq =
  -							serverMessageController.retrieveIfSequenceExists(
  -								seqAckID);
  -
  -						if (clientSeq != null) {
  -
  -							clientSeq.setSequenceAcknowledgement(
  -								rmHeaders.getSequenceAcknowledgement());
  -						}
  -
  -						if (serverSeq != null) {
  -
  -							serverSeq.setSequenceAcknowledgement(
  -								rmHeaders.getSequenceAcknowledgement());
  -						}
  -					}
  -
  -					if (rmHeaders.getSequence() != null) {
  -
  -						message.setIdentifier(
  -							rmHeaders.getSequence().getIdentifier());
  -
  -						if (msgContext.getOperation() != null) {
  -
  -							message.setOperation(msgContext.getOperation());
  -							message.setServiceDesc(
  -								msgContext
  -									.getService()
  -									.getServiceDescription());
  -							message.setServiceObject(obj);
  -
  -							// serverMessageController.insertMessage(message);
  -							// ///////
  -							// keeping message in the server no meaningfull in this mode
  -							// becouse the response is going in the same HTTP connection
  -							// just to have a in-order invoketion
  -							// we have to reffer the last message number
  -							Identifier seqID =
  -								rmHeaders.getSequence().getIdentifier();
  -							RMSequence serverSeq =
  -								serverMessageController
  -									.retrieveIfSequenceExists(
  -									seqID);
  -
  -							if (serverSeq == null) {
  -								serverSeq = new RMSequence();
  -								serverSeq.setSequenceIdentifier(seqID);
  -								serverSeq.setLastProcessedMessageNumber(0);
  -								serverMessageController.storeSequence(
  -									serverSeq);
  -							}
  -
  -							long msgNo =
  -								rmHeaders
  -									.getSequence()
  -									.getMessageNumber()
  -									.getMessageNumber();
  -							long lastProcessedMsgNo;
  -							RMMessage rmMsg =
  -								(RMMessage) serverSeq.getMessageList().get(new Long(msgNo));
  -
  -							if (rmMsg == null) {
  -								serverSeq.getMessageList().put(
  -									new Long(msgNo),
  -									message);
  -								while (true) {
  -									lastProcessedMsgNo =
  -										serverSeq
  -											.getLastProcessedMessageNumber();
  -									if (msgNo == lastProcessedMsgNo + 1) {
  -										super.processMessage(
  -											msgContext,
  -											reqEnv,
  -											resEnv,
  -											obj);
  -										lastProcessedMsgNo++;
  -										serverSeq
  -											.setLastProcessedMessageNumber(
  -											lastProcessedMsgNo);
  -										message.setResponseMessage(
  -											msgContext.getResponseMessage());
  -										break;
  -									}
  -									Thread.sleep(
  -										Constants.SERVICE_INVOKE_INTERVAL);
  -								}
  -							} else {
  -								msgContext.setResponseMessage(rmMsg.getResponseMessage());
  -								}
  -
  -					
  -
  -							// //////
  -						} else {
  -							//TODO: response message processing 
  -							//This is when we got a a response with "From as anonymous...." 
  -
  -							// haveing is?
  -
  -							RMSequence responsedSeq =
  -								clientMessageController
  -									.retrieveIfSequenceExists(
  -									rmHeaders.getSequence().getIdentifier());
  -
  -							if (responsedSeq != null) {
  -								RMMessage resMsg =
  -									responsedSeq.retrieveMessage(
  -										new Long(message.getMessageNumber()));
  -
  -								resMsg.setResponseMessage(
  -									message.getRequestMessage());
  -							}
  -
  -							responsedSeq.insertResponseMessage(message);
  -						}
  -					}
  -
  -					if (rmHeaders.getAckRequest() != null) {
  -
  -						RMSequence serSeq =
  -							serverMessageController.retrieveIfSequenceExists(
  -								rmHeaders.getAckRequest().getIdentifier());
  -						SequenceAcknowledgement seqAck =
  -							serSeq.getSequenceAcknowledgement();
  -
  -						RMHeaders ackResRMHeaders = new RMHeaders();
  -
  -						ackResRMHeaders.setSequenceAcknowledgement(seqAck);
  -						ackResRMHeaders.toSoapEnvelop(
  -							msgContext.getResponseMessage().getSOAPEnvelope());
  -
  -					}
  -				}
  -			}
  -
  -		}
  -		//msgContext.setUseSOAPAction(true);
  -		//msgContext.setSOAPActionURI("fdfdf");
  -		
  -	}
  -
  -	/**
  -	 * Method isRmHeadersAvailable
  -	 * 
  -	 * @param messageContext MessageContext
  -	 * @return boolean
  -	 * 
  -	 */
  -
  -	private boolean isRmHeadersAvailable(MessageContext messageContext) {
  -		RMHeaders rmHeaders =
  -			(RMHeaders) messageContext.getProperty(
  -				org.apache.sandesha.Constants.ENV_RM_REQUEST_HEADERS);
  -
  -		if ((rmHeaders.getAckRequest() != null)
  -			|| (rmHeaders.getCreateSequence() != null)
  -			|| (rmHeaders.getCreateSequenceResponse() != null)
  -			|| (rmHeaders.getSequence() != null)
  -			|| (rmHeaders.getSequenceAcknowledgement() != null)
  -			|| (rmHeaders.getTerminateSequence() != null)) {
  -			return true;
  -		} else
  -			return true;
  -	}
  -
  -	/**
  -	 * Method isAddressingHeadersAvailable
  -	 * 
  -	 * @param messageContext MessageContext
  -	 * @return boolean
  -	 * 
  -	 */
  -
  -	private boolean isAddressingHeadersAvailable(MessageContext messageContext) {
  -		AddressingHeaders addressingHeaders =
  -			(AddressingHeaders) messageContext.getProperty(
  -				org
  -					.apache
  -					.axis
  -					.message
  -					.addressing
  -					.Constants
  -					.ENV_ADDRESSING_REQUEST_HEADERS);
  -
  -		if ((addressingHeaders.getAction() != null)
  -			&& (addressingHeaders.getTo() != null))
  -			return true;
  -		else
  -			return false;
  -	}
  -
  -	/**
  -	 * Method terminateSequence
  -	 * 
  -	 * @param identifier 
  -	 *  
  -	 */
  -	private void terminateSequence(Identifier identifier) {
  -		//TODO: is there a way to identify whether this is the server or client
  -		//try to get both the MesageControllers and check them for this sequence
  -		ServerMessageController serverMessageController =
  -			ServerMessageController.getInstance();
  -		ClientMessageController clientMessageController =
  -			ClientMessageController.getInstance();
  -
  -		//check in serverMessageController
  -		if (serverMessageController != null) {
  -			serverMessageController.removeIfSequenceExists(identifier);
  -		}
  -		//check in clientMessageController
  -		if (clientMessageController != null) {
  -			clientMessageController.removeIfSequenceExists(identifier);
  -		}
  -	}
  -
  -	/**
  -	 * Method createSequenceResponse
  -	 * 
  -	 * Called when the createSequenceResponse message arrives
  -	 * Now we have received a sequenceIdentifier, So, store it
  -	 * To do this, use the relates to tag.
  -	 * <b>Everytime the server send the responses, it acts as a client and hence it calls ClientMessageController</b>
  -	 * 
  -	 * @param messageContext 
  -	 *  
  -	 */
  -	private void createSequenceResponse(MessageContext messageContext) {
  -		//get the ClientMessageController
  -		ClientMessageController clientMessageController =
  -			ClientMessageController.getInstance();
  -
  -		//get the Relates to id from the env
  -		AddressingHeaders addressingHeaders =
  -			(AddressingHeaders) messageContext.getProperty(
  -				org
  -					.apache
  -					.axis
  -					.message
  -					.addressing
  -					.Constants
  -					.ENV_ADDRESSING_REQUEST_HEADERS);
  -		List relatesToList = addressingHeaders.getRelatesTo();
  -		if (relatesToList.size() > 0) {
  -			RelatesTo relatesTo = (RelatesTo) relatesToList.get(0);
  -			MessageID messageId = new MessageID(relatesTo.getURI());
  -
  -			if (clientMessageController != null) {
  -				RMMessage rmMessage =
  -					clientMessageController.retrieveIfMessageExists(messageId);
  -				rmMessage.setResponseMessage(
  -					messageContext.getCurrentMessage());
  -			}
  -		}
  -	}
  -
  -	/**
  -	 * Method createSequenceResponseEnvelope
  -	 * 
  -	 * create the envelope to send to the source who require the sequence identifier
  -	 * 
  -	 * @param addressingHeaders
  -	 *     
  -	 * 
  -	 */
  -	private SOAPEnvelope createSequenceResponseEnvelope(AddressingHeaders addressingHeaders)
  -		throws Exception {
  -
  -		SOAPEnvelope envelope = new SOAPEnvelope();
  -
  -		envelope.addNamespaceDeclaration(
  -			Constants.NS_PREFIX_RM,
  -			Constants.NS_URI_RM);
  -		envelope.addNamespaceDeclaration(
  -			Constants.WSA_PREFIX,
  -			Constants.WSA_NS);
  -		envelope.addNamespaceDeclaration(
  -			Constants.WSU_PREFIX,
  -			Constants.WSU_NS);
  -
  -		Action action =
  -			new Action(new URI(Constants.ACTION_CREATE_SEQUENCE_RESPONSE));
  -		action.toSOAPHeaderElement(envelope);
  -
  -		UUIDGen uuidGen = UUIDGenFactory.getUUIDGen();
  -		MessageID messageId =
  -			new MessageID(new URI("uuid:" + uuidGen.nextUUID()));
  -		messageId.toSOAPHeaderElement(envelope);
  -
  -		To incommingTo = addressingHeaders.getTo();
  -		URI fromAddressURI = new URI(incommingTo.toString());
  -
  -		Address fromAddress = new Address(fromAddressURI);
  -		From from = new From(fromAddress);
  -		from.toSOAPHeaderElement(envelope);
  -
  -		ReplyTo incommingReplyTo = (ReplyTo) addressingHeaders.getReplyTo();
  -		Address incommingAddress = incommingReplyTo.getAddress();
  -		To to = new To(new URI(incommingAddress.toString()));
  -		to.toSOAPHeaderElement(envelope);
  +    /**
  +     * Method processMessage
  +     * 
  +     * @param msgContext
  +     * @param reqEnv
  +     * @param resEnv
  +     * @param obj
  +     * @throws Exception
  +     */
  +
  +    public void processMessage(MessageContext msgContext, SOAPEnvelope reqEnv,
  +            SOAPEnvelope resEnv, Object obj) throws Exception {
  +
  +        if (!(isRmHeadersAvailable(msgContext) && isAddressingHeadersAvailable(msgContext))) {
  +            throw new AxisFault("Insufficient Headers to Process Reliability.");
  +        } else {
  +            AddressingHeaders addressingHeaders = (AddressingHeaders) msgContext
  +                    .getProperty(org.apache.axis.message.addressing.Constants.ENV_ADDRESSING_REQUEST_HEADERS);
  +            RMHeaders rmHeaders = (RMHeaders) msgContext
  +                    .getProperty(org.apache.sandesha.Constants.ENV_RM_REQUEST_HEADERS);
  +
  +            boolean anonymousFrom = false;
  +            boolean anonymousReplyTo = false;
  +
  +            if (addressingHeaders.getFrom() != null) {
  +                if (addressingHeaders.getFrom().getAddress().toString().equals(
  +                        Constants.ANONYMOUS_URI)) {
  +                    anonymousFrom = true;
  +                }
  +            }
  +
  +            if (addressingHeaders.getReplyTo() != null) {
  +                if (addressingHeaders.getReplyTo().getAddress().toString()
  +                        .equals(Constants.ANONYMOUS_URI)) {
  +                    anonymousReplyTo = true;
  +                }
  +            }
  +
  +            ServerMessageController serverMessageController = ServerMessageController
  +                    .getInstance();
  +            ClientMessageController clientMessageController = ClientMessageController
  +                    .getInstance();
  +
  +            Action action = addressingHeaders.getAction();
  +            String strAction = action.toString();
  +            //this returns something like
  +            // "http://schemas.xmlsoap.org/ws/2004/03/rm/TerminateSequence"
  +
  +            if (strAction.equals(Constants.ACTION_CREATE_SEQUENCE)) {
  +                //TODO:create the required env and send it to the source
  +
  +                if (!anonymousReplyTo) {
  +                    //TODO:add the create seq flags
  +                    ////////////////////////////////////////////////////
  +                    ////////////////////////////////////////////////////
  +
  +                    SOAPEnvelope envelope = createSequenceResponseEnvelope(addressingHeaders);
  +                    //create the call
  +                    Service service = new Service();
  +                    Call call = (Call) service.createCall();
  +
  +                    //get the reply address
  +                    ReplyTo replyTo = (ReplyTo) addressingHeaders.getReplyTo();
  +                    URI replyToAddress = replyTo.getAddress();
  +                    call.setTargetEndpointAddress(replyToAddress.toString());
  +
  +                    RMHeaders createSeqRMHeadres = new RMHeaders();
  +                    createSeqRMHeadres.fromSOAPEnvelope(envelope);
  +                    RMSequence createSeq = new RMSequence();
  +                    createSeq.setSequenceIdentifier(createSeqRMHeadres
  +                            .getCreateSequenceResponse().getIdentifier());
  +                    createSeq.setClientDidReclamtion(true);
  +                    serverMessageController.storeSequence(createSeq);
  +
  +                    Message msg = new Message(envelope);
  +                    call.setRequestMessage(msg);
  +
  +                    //call.setReturnType(XMLType.AXIS_VOID);
  +
  +                    //invoke
  +                    call.invoke();
  +
  +                    //disconnect http
  +                    msgContext.setResponseMessage(null);
  +                } else {
  +
  +                    //KEEP THE MESSAGE/////////////////////////////////////////
  +                    //TODO:
  +
  +                    SOAPEnvelope envelope = createSequenceResponseEnvelope(addressingHeaders);
  +                    RMHeaders createSeqRMHeadres = new RMHeaders();
  +                    createSeqRMHeadres.fromSOAPEnvelope(envelope);
  +                    RMSequence createSeq = new RMSequence();
  +                    createSeq.setSequenceIdentifier(createSeqRMHeadres
  +                            .getCreateSequenceResponse().getIdentifier());
  +                    createSeq.setClientDidReclamtion(true);
  +                    serverMessageController.storeSequence(createSeq);
  +                    msgContext.setResponseMessage(new Message(envelope));
  +                }
  +
  +            } else if (strAction
  +                    .equals(Constants.ACTION_CREATE_SEQUENCE_RESPONSE)) {
  +                //TODO:
  +
  +                createSequenceResponse(msgContext);
  +
  +            } else if (strAction.equals(Constants.ACTION_TERMINATE_SEQUENCE)) {
  +                //TODO:
  +                //
  +                terminateSequence(rmHeaders.getTerminateSequence()
  +                        .getIdentifier());
  +            } else {
  +                if (!anonymousFrom) {
  +                    ///TODO Check MessageInserter
  +                    MessageInserter messageInserter = new MessageInserter(
  +                            msgContext, obj);
  +                    Thread thread = new Thread(messageInserter);
  +                    thread.start();
  +                    msgContext.setResponseMessage(null);
  +
  +                } else {
  +
  +                    RMMessage message = new RMMessage();
  +
  +                    message.setAddressingHeaders(addressingHeaders);
  +                    message.setRMHeaders(rmHeaders);
  +                    message.setRequestMessage(msgContext.getRequestMessage());
  +                    msgContext.setEncodingStyle(msgContext.getEncodingStyle());
  +
  +                    if (rmHeaders.getSequenceAcknowledgement() != null) {
  +
  +                        Identifier seqAckID = rmHeaders
  +                                .getSequenceAcknowledgement().getIdentifier();
  +                        RMSequence clientSeq = clientMessageController
  +                                .retrieveIfSequenceExists(seqAckID);
  +                        RMSequence serverSeq = serverMessageController
  +                                .retrieveIfSequenceExists(seqAckID);
  +
  +                        if (clientSeq != null) {
  +
  +                            clientSeq.setSequenceAcknowledgement(rmHeaders
  +                                    .getSequenceAcknowledgement());
  +                        }
  +
  +                        if (serverSeq != null) {
  +
  +                            serverSeq.setSequenceAcknowledgement(rmHeaders
  +                                    .getSequenceAcknowledgement());
  +                        }
  +                    }
  +
  +                    if (rmHeaders.getSequence() != null) {
  +
  +                        message.setIdentifier(rmHeaders.getSequence()
  +                                .getIdentifier());
  +
  +                        if (msgContext.getOperation() != null) {
  +
  +                            message.setOperation(msgContext.getOperation());
  +                            message.setServiceDesc(msgContext.getService()
  +                                    .getServiceDescription());
  +                            message.setServiceObject(obj);
  +
  +                            // serverMessageController.insertMessage(message);
  +                            // ///////
  +                            // keeping message in the server no meaningfull in
  +                            // this mode
  +                            // becouse the response is going in the same HTTP
  +                            // connection
  +                            // just to have a in-order invoketion
  +                            // we have to reffer the last message number
  +                            Identifier seqID = rmHeaders.getSequence()
  +                                    .getIdentifier();
  +                            RMSequence serverSeq = serverMessageController
  +                                    .retrieveIfSequenceExists(seqID);
  +
  +                            if (serverSeq == null) {
  +                                serverSeq = new RMSequence();
  +                                serverSeq.setSequenceIdentifier(seqID);
  +                                serverSeq.setLastProcessedMessageNumber(0);
  +                                serverMessageController
  +                                        .storeSequence(serverSeq);
  +                            }
  +
  +                            long msgNo = rmHeaders.getSequence()
  +                                    .getMessageNumber().getMessageNumber();
  +                            long lastProcessedMsgNo;
  +                            RMMessage rmMsg = (RMMessage) serverSeq
  +                                    .getMessageList().get(new Long(msgNo));
  +
  +                            if (rmMsg == null) {
  +                                serverSeq.getMessageList().put(new Long(msgNo),
  +                                        message);
  +                                while (true) {
  +                                    lastProcessedMsgNo = serverSeq
  +                                            .getLastProcessedMessageNumber();
  +                                    if (msgNo == lastProcessedMsgNo + 1) {
  +                                        super.processMessage(msgContext,
  +                                                reqEnv, resEnv, obj);
  +                                        lastProcessedMsgNo++;
  +                                        serverSeq
  +                                                .setLastProcessedMessageNumber(lastProcessedMsgNo);
  +                                        message.setResponseMessage(msgContext
  +                                                .getResponseMessage());
  +                                        break;
  +                                    }
  +                                    Thread
  +                                            .sleep(Constants.SERVICE_INVOKE_INTERVAL);
  +                                }
  +                            } else {
  +                                msgContext.setResponseMessage(rmMsg
  +                                        .getResponseMessage());
  +                            }
  +
  +                            // //////
  +                        } else {
  +                            //TODO: response message processing
  +                            //This is when we got a a response with "From as
  +                            // anonymous...."
  +
  +                            // haveing is?
  +
  +                            RMSequence responsedSeq = clientMessageController
  +                                    .retrieveIfSequenceExists(rmHeaders
  +                                            .getSequence().getIdentifier());
  +
  +                            if (responsedSeq != null) {
  +                                RMMessage resMsg = responsedSeq
  +                                        .retrieveMessage(new Long(message
  +                                                .getMessageNumber()));
  +
  +                                resMsg.setResponseMessage(message
  +                                        .getRequestMessage());
  +                            }
  +
  +                            responsedSeq.insertResponseMessage(message);
  +                        }
  +                    }
  +
  +                    if (rmHeaders.getAckRequest() != null) {
  +
  +                        RMSequence serSeq = serverMessageController
  +                                .retrieveIfSequenceExists(rmHeaders
  +                                        .getAckRequest().getIdentifier());
  +                        SequenceAcknowledgement seqAck = serSeq
  +                                .getSequenceAcknowledgement();
  +
  +                        RMHeaders ackResRMHeaders = new RMHeaders();
  +
  +                        ackResRMHeaders.setSequenceAcknowledgement(seqAck);
  +                        ackResRMHeaders.toSoapEnvelop(msgContext
  +                                .getResponseMessage().getSOAPEnvelope());
  +
  +                    }
  +                }
  +            }
  +
  +        }
  +        //msgContext.setUseSOAPAction(true);
  +        //msgContext.setSOAPActionURI("fdfdf");
  +
  +    }
  +
  +    /**
  +     * Method isRmHeadersAvailable
  +     * 
  +     * @param messageContext
  +     *            MessageContext
  +     * @return boolean
  +     *  
  +     */
  +
  +    private boolean isRmHeadersAvailable(MessageContext messageContext) {
  +        RMHeaders rmHeaders = (RMHeaders) messageContext
  +                .getProperty(org.apache.sandesha.Constants.ENV_RM_REQUEST_HEADERS);
  +
  +        if ((rmHeaders.getAckRequest() != null)
  +                || (rmHeaders.getCreateSequence() != null)
  +                || (rmHeaders.getCreateSequenceResponse() != null)
  +                || (rmHeaders.getSequence() != null)
  +                || (rmHeaders.getSequenceAcknowledgement() != null)
  +                || (rmHeaders.getTerminateSequence() != null)) {
  +            return true;
  +        } else
  +            return true;
  +    }
  +
  +    /**
  +     * Method isAddressingHeadersAvailable
  +     * 
  +     * @param messageContext
  +     *            MessageContext
  +     * @return boolean
  +     *  
  +     */
  +
  +    private boolean isAddressingHeadersAvailable(MessageContext messageContext) {
  +        AddressingHeaders addressingHeaders = (AddressingHeaders) messageContext
  +                .getProperty(org.apache.axis.message.addressing.Constants.ENV_ADDRESSING_REQUEST_HEADERS);
  +
  +        if ((addressingHeaders.getAction() != null)
  +                && (addressingHeaders.getTo() != null))
  +            return true;
  +        else
  +            return false;
  +    }
  +
  +    /**
  +     * Method terminateSequence
  +     * 
  +     * @param identifier
  +     *  
  +     */
  +    private void terminateSequence(Identifier identifier) {
  +        //TODO: is there a way to identify whether this is the server or client
  +        //try to get both the MesageControllers and check them for this
  +        // sequence
  +        ServerMessageController serverMessageController = ServerMessageController
  +                .getInstance();
  +        ClientMessageController clientMessageController = ClientMessageController
  +                .getInstance();
  +
  +        //check in serverMessageController
  +        if (serverMessageController != null) {
  +            serverMessageController.removeIfSequenceExists(identifier);
  +        }
  +        //check in clientMessageController
  +        if (clientMessageController != null) {
  +            clientMessageController.removeIfSequenceExists(identifier);
  +        }
  +    }
  +
  +    /**
  +     * Method createSequenceResponse
  +     * 
  +     * Called when the createSequenceResponse message arrives Now we have
  +     * received a sequenceIdentifier, So, store it To do this, use the relates
  +     * to tag. <b>Everytime the server send the responses, it acts as a client
  +     * and hence it calls ClientMessageController </b>
  +     * 
  +     * @param messageContext
  +     *  
  +     */
  +    private void createSequenceResponse(MessageContext messageContext) {
  +        //get the ClientMessageController
  +        ClientMessageController clientMessageController = ClientMessageController
  +                .getInstance();
  +
  +        //get the Relates to id from the env
  +        AddressingHeaders addressingHeaders = (AddressingHeaders) messageContext
  +                .getProperty(org.apache.axis.message.addressing.Constants.ENV_ADDRESSING_REQUEST_HEADERS);
  +        List relatesToList = addressingHeaders.getRelatesTo();
  +        if (relatesToList.size() > 0) {
  +            RelatesTo relatesTo = (RelatesTo) relatesToList.get(0);
  +            MessageID messageId = new MessageID(relatesTo.getURI());
  +
  +            if (clientMessageController != null) {
  +                RMMessage rmMessage = clientMessageController
  +                        .retrieveIfMessageExists(messageId);
  +                rmMessage
  +                        .setResponseMessage(messageContext.getCurrentMessage());
  +            }
  +        }
  +    }
  +
  +    /**
  +     * Method createSequenceResponseEnvelope
  +     * 
  +     * create the envelope to send to the source who require the sequence
  +     * identifier
  +     * 
  +     * @param addressingHeaders
  +     * 
  +     *  
  +     */
  +    private SOAPEnvelope createSequenceResponseEnvelope(
  +            AddressingHeaders addressingHeaders) throws Exception {
  +
  +        SOAPEnvelope envelope = new SOAPEnvelope();
  +
  +        envelope.addNamespaceDeclaration(Constants.NS_PREFIX_RM,
  +                Constants.NS_URI_RM);
  +        envelope
  +                .addNamespaceDeclaration(Constants.WSA_PREFIX, Constants.WSA_NS);
  +        envelope
  +                .addNamespaceDeclaration(Constants.WSU_PREFIX, Constants.WSU_NS);
  +
  +        Action action = new Action(new URI(
  +                Constants.ACTION_CREATE_SEQUENCE_RESPONSE));
  +        action.toSOAPHeaderElement(envelope);
  +
  +        UUIDGen uuidGen = UUIDGenFactory.getUUIDGen();
  +        MessageID messageId = new MessageID(new URI("uuid:"
  +                + uuidGen.nextUUID()));
  +        messageId.toSOAPHeaderElement(envelope);
  +
  +        To incommingTo = addressingHeaders.getTo();
  +        URI fromAddressURI = new URI(incommingTo.toString());
  +
  +        Address fromAddress = new Address(fromAddressURI);
  +        From from = new From(fromAddress);
  +        from.toSOAPHeaderElement(envelope);
  +
  +        ReplyTo incommingReplyTo = (ReplyTo) addressingHeaders.getReplyTo();
  +        Address incommingAddress = incommingReplyTo.getAddress();
  +        To to = new To(new URI(incommingAddress.toString()));
  +        to.toSOAPHeaderElement(envelope);
   
  -		MessageID incommingMessageId = addressingHeaders.getMessageID();
  -		AddressingHeaders outgoingAddressingHaders = new AddressingHeaders();
  +        MessageID incommingMessageId = addressingHeaders.getMessageID();
  +        AddressingHeaders outgoingAddressingHaders = new AddressingHeaders();
           outgoingAddressingHaders.setSetMustUnderstand(true);
  -		outgoingAddressingHaders.addRelatesTo(
  -			incommingMessageId.toString(),
  -			(new QName(Constants.WSA_PREFIX, Constants.WSA_NS)));
  -
  -		//now set the body elements
  -		CreateSequenceResponse response = new CreateSequenceResponse();
  -		//UUIDGen uuidGen = UUIDGenFactory.getUUIDGen();
  -		Identifier id = new Identifier();
  -		id.setIdentifier("uuid:" + uuidGen.nextUUID());
  -		response.setIdentifier(id);
  -		response.toSoapEnvelop(envelope);
  +        outgoingAddressingHaders.addRelatesTo(incommingMessageId.toString(),
  +                (new QName(Constants.WSA_PREFIX, Constants.WSA_NS)));
  +
  +        //now set the body elements
  +        CreateSequenceResponse response = new CreateSequenceResponse();
  +        //UUIDGen uuidGen = UUIDGenFactory.getUUIDGen();
  +        Identifier id = new Identifier();
  +        id.setIdentifier("uuid:" + uuidGen.nextUUID());
  +        response.setIdentifier(id);
  +        response.toSoapEnvelop(envelope);
   
  -		outgoingAddressingHaders.toEnvelope(envelope);
  +        outgoingAddressingHaders.toEnvelope(envelope);
   
  -		return envelope;
  -	}
  +        return envelope;
  +    }
   
  -}
  +}
  \ No newline at end of file