Author: chamikara
Date: Sun Jun 24 12:50:13 2007
New Revision: 550279

URL: http://svn.apache.org/viewvc?view=rev&rev=550279
Log:
Sandesha2Global In Handler was changed to throw Exceptions if service 
dispatching has not happened correctly.
Added some code comments.
Some corrections to the AckRequested Processor.
A bug fix in the SenderWorker.

Modified:
    
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/RMMsgContext.java
    
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/handlers/SandeshaGlobalInHandler.java
    
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/handlers/SandeshaInHandler.java
    
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/msgprocessors/AckRequestedProcessor.java
    
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/util/RMMsgCreator.java
    
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/workers/SenderWorker.java

Modified: 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/RMMsgContext.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/RMMsgContext.java?view=diff&rev=550279&r1=550278&r2=550279
==============================================================================
--- 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/RMMsgContext.java
 (original)
+++ 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/RMMsgContext.java
 Sun Jun 24 12:50:13 2007
@@ -65,7 +65,9 @@
 
        /**
         * To add a new SOAP envelope to the message. The generated envelope 
will belong 
-        * to the SOAP version of the MessageContext.
+        * to the SOAP version of the MessageContext. We will be going through 
each MessagePart and adding it to the
+        * envelope. In other words all the MessageParts that are available in 
the RMMsg will be added to the SOAP 
+        * envelope after this.
         * 
         * @throws SandeshaException
         */

Modified: 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/handlers/SandeshaGlobalInHandler.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/handlers/SandeshaGlobalInHandler.java?view=diff&rev=550279&r1=550278&r2=550279
==============================================================================
--- 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/handlers/SandeshaGlobalInHandler.java
 (original)
+++ 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/handlers/SandeshaGlobalInHandler.java
 Sun Jun 24 12:50:13 2007
@@ -24,8 +24,10 @@
 import org.apache.axiom.soap.SOAPEnvelope;
 import org.apache.axiom.soap.SOAPHeader;
 import org.apache.axis2.AxisFault;
+import org.apache.axis2.addressing.RelatesTo;
 import org.apache.axis2.context.MessageContext;
 import org.apache.axis2.description.AxisOperation;
+import org.apache.axis2.description.AxisService;
 import org.apache.axis2.description.Parameter;
 import org.apache.axis2.handlers.AbstractHandler;
 import org.apache.commons.logging.Log;
@@ -183,6 +185,8 @@
         secManager.checkProofOfPossession(token, seqHeader, 
rmMsgCtx.getMessageContext());
         secManager.checkProofOfPossession(token, body, 
rmMsgCtx.getMessageContext());
       }
+      
+      MessageContext messageContext = rmMsgCtx.getMessageContext();
     
       if (bean != null) {
         
@@ -206,27 +210,54 @@
           storageManager.getRMDBeanMgr().update(bean);
         }
         else {
+           
           if (log.isDebugEnabled())
-            log.debug("Detected duplicate message " + msgNo);
-          rmMsgCtx.getMessageContext().setRelationships(null);
+              log.debug("Detected duplicate message " + msgNo);
+            
+            // Add the duplicate RM AxisOperation to the message
+            
+            //If the service has not been found by this time, we cannot 
proceed.
+            AxisService service = 
rmMsgCtx.getMessageContext().getAxisService();
+            if (service==null)
+                 throw new SandeshaException ("Duplicate message detected. But 
cant dispatch since the Service has not been found");
+            
+            AxisOperation duplicateMessageOperation = 
SpecSpecificConstants.getWSRMOperation(
+                Sandesha2Constants.MessageTypes.DUPLICATE_MESSAGE,
+                Sandesha2Constants.SPEC_VERSIONS.v1_0,
+                service);
+            
rmMsgCtx.getMessageContext().setAxisOperation(duplicateMessageOperation);
+            
+            
+            /**
+             * Adding a MessageID here if this is a response message. If this 
is not added AddressingValidators will fail.
+             * This is becoz the DuplicateOperation I added here has a InOut 
operation. According to Addressing a InOut msg
+             * Must contain a MessageID.
+             */
+            
+            RelatesTo relatesTo = messageContext.getRelatesTo();
+            String messageID = messageContext.getOptions().getMessageId();
+            if (relatesTo!=null && messageID==null) {
+               messageContext.getOptions().setMessageId 
(SandeshaUtil.getUUID());
+            }
+        }
+      } else {
+        
+        if (log.isDebugEnabled())
+            log.debug("Detected message for no sequence " + msgNo);
+          messageContext.setRelationships(null);
           // Add the duplicate RM AxisOperation to the message
+
+          //If the service has not been found by this time, we cannot proceed.
+          AxisService service = rmMsgCtx.getMessageContext().getAxisService();
+          if (service==null)
+                 throw new SandeshaException ("Duplicate message detected. But 
cant dispatch since the Service has not been found");
+          
           AxisOperation duplicateMessageOperation = 
SpecSpecificConstants.getWSRMOperation(
               Sandesha2Constants.MessageTypes.DUPLICATE_MESSAGE,
               Sandesha2Constants.SPEC_VERSIONS.v1_0,
-              rmMsgCtx.getMessageContext().getAxisService());
+              service);
           
rmMsgCtx.getMessageContext().setAxisOperation(duplicateMessageOperation);
-        }
-              
-      } else {
-        if (log.isDebugEnabled())
-          log.debug("Detected message for no sequence " + msgNo);
-        rmMsgCtx.getMessageContext().setRelationships(null);
-        // Add the duplicate RM AxisOperation to the message
-        AxisOperation duplicateMessageOperation = 
SpecSpecificConstants.getWSRMOperation(
-            Sandesha2Constants.MessageTypes.DUPLICATE_MESSAGE,
-            Sandesha2Constants.SPEC_VERSIONS.v1_0,
-            rmMsgCtx.getMessageContext().getAxisService());
-        
rmMsgCtx.getMessageContext().setAxisOperation(duplicateMessageOperation);
+          
       }
       
       if(transaction != null && transaction.isActive()) transaction.commit();

Modified: 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/handlers/SandeshaInHandler.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/handlers/SandeshaInHandler.java?view=diff&rev=550279&r1=550278&r2=550279
==============================================================================
--- 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/handlers/SandeshaInHandler.java
 (original)
+++ 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/handlers/SandeshaInHandler.java
 Sun Jun 24 12:50:13 2007
@@ -102,10 +102,10 @@
 
                        RMMsgContext rmMsgCtx = null;
       
-      if 
(msgCtx.getProperty(Sandesha2Constants.MessageContextProperties.RM_MESSAGE_CONTEXT)
 != null)
-        rmMsgCtx = 
(RMMsgContext)msgCtx.getProperty(Sandesha2Constants.MessageContextProperties.RM_MESSAGE_CONTEXT);
-      else
-        rmMsgCtx = MsgInitializer.initializeMessage(msgCtx);
+                       if 
(msgCtx.getProperty(Sandesha2Constants.MessageContextProperties.RM_MESSAGE_CONTEXT)
 != null)
+                               rmMsgCtx = 
(RMMsgContext)msgCtx.getProperty(Sandesha2Constants.MessageContextProperties.RM_MESSAGE_CONTEXT);
+                       else
+                               rmMsgCtx = 
MsgInitializer.initializeMessage(msgCtx);
 
                        // validating the message
                        MessageValidator.validateIncomingMessage(rmMsgCtx, 
storageManager);

Modified: 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/msgprocessors/AckRequestedProcessor.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/msgprocessors/AckRequestedProcessor.java?view=diff&rev=550279&r1=550278&r2=550279
==============================================================================
--- 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/msgprocessors/AckRequestedProcessor.java
 (original)
+++ 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/msgprocessors/AckRequestedProcessor.java
 Sun Jun 24 12:50:13 2007
@@ -36,6 +36,9 @@
 import org.apache.axis2.context.ServiceContext;
 import org.apache.axis2.description.AxisOperation;
 import org.apache.axis2.engine.AxisEngine;
+import org.apache.axis2.transport.mail.MailBasedOutTransportInfo;
+import org.apache.axis2.util.MessageContextBuilder;
+import org.apache.axis2.util.Utils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.sandesha2.RMMsgContext;
@@ -110,6 +113,7 @@
                if (log.isDebugEnabled())
                        log.debug("Enter: 
AckRequestedProcessor::processAckRequestedHeader " + soapHeader);
 
+               //checks weather the ack request was a piggybacked one.
                boolean piggybackedAckRequest = 
!(rmMsgCtx.getMessageType()==Sandesha2Constants.MessageTypes.ACK_REQUEST);
                
                String sequenceId = 
ackRequested.getIdentifier().getIdentifier();
@@ -123,7 +127,7 @@
                // Check that the sender of this AckRequest holds the correct 
token
                RMDBean rmdBean = 
SandeshaUtil.getRMDBeanFromSequenceId(storageManager, sequenceId);
 
-               if(rmdBean != null && rmdBean.getSecurityTokenData() != null) {;
+               if(rmdBean != null && rmdBean.getSecurityTokenData() != null) {
                        SecurityManager secManager = 
SandeshaUtil.getSecurityManager(configurationContext);
                        SecurityToken token = 
secManager.recoverSecurityToken(rmdBean.getSecurityTokenData());
                        
@@ -151,22 +155,28 @@
                if (acksToStr == null)
                        throw new 
SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.acksToStrNotSet));
 
+               //Getting the operation for ack messages.
                AxisOperation ackOperation = 
SpecSpecificConstants.getWSRMOperation(
                                Sandesha2Constants.MessageTypes.ACK,
                                rmdBean.getRMVersion(),
                                msgContext.getAxisService());
-               MessageContext ackMsgCtx = 
SandeshaUtil.createNewRelatedMessageContext(rmMsgCtx, ackOperation);
-
-               
ackMsgCtx.setProperty(Sandesha2Constants.APPLICATION_PROCESSING_DONE, "true");
-
+               
+               //creating the ack message. If the ackRequest was a standalone 
this will be a out (response) message 
+               MessageContext ackMsgCtx = null;
+//             if (piggybackedAckRequest)
+                       ackMsgCtx = 
SandeshaUtil.createNewRelatedMessageContext(rmMsgCtx, ackOperation);
+//             else
+//                     ackMsgCtx 
=MessageContextBuilder.createOutMessageContext (msgContext);
+                       
+               //setting up the RMMsgContext
                RMMsgContext ackRMMsgCtx = 
MsgInitializer.initializeMessage(ackMsgCtx);
                ackRMMsgCtx.setRMNamespaceValue(rmMsgCtx.getRMNamespaceValue());
-
-               ackMsgCtx.setMessageID(SandeshaUtil.getUUID());
-
+               
+               if (ackMsgCtx.getMessageID()==null)
+                       ackMsgCtx.setMessageID(SandeshaUtil.getUUID());
+               
+               //adding the SOAP Envelope
                SOAPFactory factory = 
SOAPAbstractFactory.getSOAPFactory(SandeshaUtil.getSOAPVersion(msgContext.getEnvelope()));
-
-               // Setting new envelope
                SOAPEnvelope envelope = factory.getDefaultEnvelope();
                try {
                        ackMsgCtx.setEnvelope(envelope);
@@ -177,13 +187,20 @@
                ackMsgCtx.setTo(acksTo);
                ackMsgCtx.setReplyTo(msgContext.getTo());
                RMMsgCreator.addAckMessage(ackRMMsgCtx, sequenceId, rmdBean);
+               
+               //this is not a client generated message. So set serverSide to 
true.
                ackRMMsgCtx.getMessageContext().setServerSide(true);
 
                if (acksTo.hasAnonymousAddress()) {
-
+                       //If acksTo is anonymous we will be sending the ack 
here it self. Transport will use what ever mechanism to send the 
+                       //message. (for e.g. HTTP will use the back channel)
+                       
+                       
                        AxisEngine engine = new 
AxisEngine(ackRMMsgCtx.getMessageContext().getConfigurationContext());
 
                        // setting CONTEXT_WRITTEN since acksto is anonymous
+                       
+                       //adding an OperationContext if one is not available. 
(for e.g. If we are in the SandeshaGlobalInHandler)
                        if (rmMsgCtx.getMessageContext().getOperationContext() 
== null) {
                                // operation context will be null when doing in 
a GLOBAL
                                // handler.
@@ -194,11 +211,16 @@
                                
rmMsgCtx.getMessageContext().setOperationContext(opCtx);
                        }
 
+                       //the response will be written here.
                        
rmMsgCtx.getMessageContext().getOperationContext().setProperty(org.apache.axis2.Constants.RESPONSE_WRITTEN,
                                        Constants.VALUE_TRUE);
 
+                       //Marking that we did the acking here.
                        
rmMsgCtx.getMessageContext().setProperty(Sandesha2Constants.ACK_WRITTEN, 
"true");
 
+                       
+                       MailBasedOutTransportInfo outTrnInfo = 
(MailBasedOutTransportInfo) 
ackRMMsgCtx.getMessageContext().getOptions().getProperty(Constants.OUT_TRANSPORT_INFO);
+
                        try {
                                engine.send(ackRMMsgCtx.getMessageContext());
                        } catch (AxisFault e1) {
@@ -206,8 +228,10 @@
                        }
 
                } else {
-
-                       SenderBeanMgr retransmitterBeanMgr = 
storageManager.getSenderBeanMgr();
+                       //If AcksTo is non-anonymous we will be adding a 
senderBean entry here. The sender is responsible 
+                       //for sending it out.
+                       
+                       SenderBeanMgr senderBeanMgr = 
storageManager.getSenderBeanMgr();
 
                        String key = SandeshaUtil.getUUID();
 
@@ -217,7 +241,10 @@
                        SenderBean ackBean = new SenderBean();
                        ackBean.setMessageContextRefKey(key);
                        ackBean.setMessageID(ackMsgCtx.getMessageID());
+                       
+                       //acks are sent only once.
                        ackBean.setReSend(false);
+                       
                        ackBean.setSequenceID(sequenceId);
                        
                        EndpointReference to = ackMsgCtx.getTo();
@@ -228,35 +255,25 @@
                        ackBean.setSend(true);
 
                        
ackMsgCtx.setProperty(Sandesha2Constants.QUALIFIED_FOR_SENDING, 
Sandesha2Constants.VALUE_FALSE);
-
                        
ackBean.setMessageType(Sandesha2Constants.MessageTypes.ACK);
-
-                       // the internalSequenceId value of the retransmitter 
Table for the
-                       // messages related to an incoming
-                       // sequence is the actual sequence ID
-
-                       // operation is the lowest level, Sandesha2 can be 
engaged.
-                       SandeshaPolicyBean propertyBean = 
SandeshaUtil.getPropertyBean(msgContext.getAxisOperation());
+                       SandeshaPolicyBean propertyBean = 
SandeshaUtil.getPropertyBean(msgContext.getAxisMessage());
 
                        long ackInterval = 
propertyBean.getAcknowledgementInterval();
 
-                       // Ack will be sent as stand alone, only after the 
retransmitter
-                       // interval.
+                       // Ack will be sent as stand alone, only after the 
ackknowledgement interval
                        long timeToSend = System.currentTimeMillis() + 
ackInterval;
 
                        // removing old acks.
                        SenderBean findBean = new SenderBean();
                        
findBean.setMessageType(Sandesha2Constants.MessageTypes.ACK);
-                       findBean.setSend(true);
-                       findBean.setReSend(false);
-                       Collection coll = retransmitterBeanMgr.find(findBean);
+                       Collection coll = senderBeanMgr.find(findBean);
                        Iterator it = coll.iterator();
 
                        if (it.hasNext()) {
                                SenderBean oldAckBean = (SenderBean) it.next();
-                               // If there is an old ack. This ack will be 
sent in the old timeToSend.
+                               // If there is an old Ack. This Ack will be 
sent in the old timeToSend.
                                timeToSend = oldAckBean.getTimeToSend(); 
-                               
retransmitterBeanMgr.delete(oldAckBean.getMessageID());
+                               senderBeanMgr.delete(oldAckBean.getMessageID());
                        }
 
                        ackBean.setTimeToSend(timeToSend);
@@ -264,18 +281,19 @@
                        
msgContext.setProperty(Sandesha2Constants.QUALIFIED_FOR_SENDING, 
Sandesha2Constants.VALUE_FALSE);
                        
                        // passing the message through sandesha2sender
-
                        SandeshaUtil.executeAndStore(ackRMMsgCtx, key);
 
-                       // inserting the new ack.
-                       retransmitterBeanMgr.insert(ackBean);
+                       // inserting the new Ack.
+                       senderBeanMgr.insert(ackBean);
 
                        msgContext.pause();
 
                        if (log.isDebugEnabled())
                                log.debug("Exit: 
AckRequestedProcessor::processAckRequestedHeader " + Boolean.TRUE);
-                       return true;
+                       
                }
+               
+               //No need to suspend. Just proceed.
                return false;
        }
        

Modified: 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/util/RMMsgCreator.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/util/RMMsgCreator.java?view=diff&rev=550279&r1=550278&r2=550279
==============================================================================
--- 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/util/RMMsgCreator.java
 (original)
+++ 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/util/RMMsgCreator.java
 Sun Jun 24 12:50:13 2007
@@ -31,6 +31,7 @@
 import org.apache.axis2.description.AxisOperation;
 import org.apache.axis2.description.AxisService;
 import org.apache.axis2.description.Parameter;
+import org.apache.axis2.util.MessageContextBuilder;
 import org.apache.axis2.util.Utils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -395,10 +396,22 @@
                                
Sandesha2Constants.MessageParts.CLOSE_SEQUENCE_RESPONSE, action);
        }
 
+       /**
+        * This will create a response message context using the Axis2 Util 
methods (where things like relatesTo transformation will
+        * happen). This will also  make sure that created out message is 
correctly secured using the Sequence Token Data of the sequence.
+        * 
+        * @param requestMsg The request message
+        * @param rmSequenceBean 
+        * @param part
+        * @param messagePartId
+        * @param action
+        * @return
+        * @throws AxisFault
+        */
        private static RMMsgContext createResponseMsg(RMMsgContext requestMsg, 
RMSequenceBean rmSequenceBean, IOMRMPart part, 
                        int messagePartId, String action) throws AxisFault {
 
-               MessageContext outMessage = 
Utils.createOutMessageContext(requestMsg.getMessageContext());
+               MessageContext outMessage = 
MessageContextBuilder.createOutMessageContext (requestMsg.getMessageContext());
                RMMsgContext responseRMMsg = new RMMsgContext(outMessage);
                SOAPFactory factory = 
SOAPAbstractFactory.getSOAPFactory(SandeshaUtil.getSOAPVersion(requestMsg.getSOAPEnvelope()));
 
@@ -422,10 +435,10 @@
        }
 
        /**
-        * Adds an ack message to the given application message.
+        * Adds an Ack of specific sequence to the given application message.
         * 
-        * @param applicationMsg
-        * @param sequenceId
+        * @param applicationMsg The Message to which the Ack will be added
+        * @param sequenceId - The sequence to which we will be Acking
         * @throws SandeshaException
         */
        public static void addAckMessage(RMMsgContext applicationMsg, String 
sequenceId, RMDBean rmdBean)
@@ -531,6 +544,14 @@
                return makeConnectionRMMessageCtx;
        }
 
+       /**
+        * This will add necessary data to a out-bound message to make sure 
that is is correctly secured.
+        * Security Token Data will be taken from the Sandesha2 security 
manager.
+        * 
+        * @param rmBean Sequence bean to identify the sequence. This could be 
an in-bound sequence or an out-bound sequence.
+        * @param message - The message which will be secured.
+        * @throws SandeshaException 
+        */
        public static void secureOutboundMessage(RMSequenceBean rmBean, 
MessageContext message)
        throws SandeshaException
        {

Modified: 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/workers/SenderWorker.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/workers/SenderWorker.java?view=diff&rev=550279&r1=550278&r2=550279
==============================================================================
--- 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/workers/SenderWorker.java
 (original)
+++ 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/workers/SenderWorker.java
 Sun Jun 24 12:50:13 2007
@@ -16,7 +16,7 @@
 import org.apache.axis2.context.OperationContext;
 import org.apache.axis2.context.ServiceContext;
 import org.apache.axis2.description.AxisOperation;
-import org.apache.axis2.description.OutInAxisOperation;
+import org.apache.axis2.description.OutOnlyAxisOperation;
 import org.apache.axis2.engine.AxisEngine;
 import org.apache.axis2.engine.Handler.InvocationResponse;
 import org.apache.axis2.transport.RequestResponseTransport;
@@ -606,7 +606,7 @@
                                
                                AxisOperation operation = 
msgCtx.getAxisOperation();
                                if (operation!=null && 
responseMessageContext.getAxisMessage()==null
-                                               && (operation instanceof 
OutInAxisOperation))
+                                               && !(operation instanceof 
OutOnlyAxisOperation))
                                        
responseMessageContext.setAxisMessage(operation.getMessage(WSDLConstants.MESSAGE_LABEL_IN_VALUE));
 
                                RMMsgContext responseRMMessage = 
MsgInitializer.initializeMessage(responseMessageContext);



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to