Author: davidillsley
Date: Wed Jun  4 09:26:12 2008
New Revision: 663295

URL: http://svn.apache.org/viewvc?rev=663295&view=rev
Log:
SANDESHA2-152
Contributor: Dave Parsons

Modified:
    
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/msgprocessors/MakeConnectionProcessor.java

Modified: 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/msgprocessors/MakeConnectionProcessor.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/msgprocessors/MakeConnectionProcessor.java?rev=663295&r1=663294&r2=663295&view=diff
==============================================================================
--- 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/msgprocessors/MakeConnectionProcessor.java
 (original)
+++ 
webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/msgprocessors/MakeConnectionProcessor.java
 Wed Jun  4 09:26:12 2008
@@ -98,15 +98,19 @@
                SecurityToken token = 
secManager.getSecurityToken(rmMsgCtx.getMessageContext());
                
                //we want to find valid sender beans
+               List possibleBeans = null;
+               int possibleBeanIndex = -10;
                SenderBean findSenderBean = new SenderBean();
+               boolean secured = false;
                if(token!=null && identifier==null){
+                       secured = true;
                        if(log.isDebugEnabled()) log.debug("token found " + 
token);
                        //this means we have to scope our search for sender 
beans that belong to sequences that own the same token
                        String data = secManager.getTokenRecoveryData(token);
                        //first look for RMS beans
                        RMSBean finderRMS = new RMSBean();
                        finderRMS.setSecurityTokenData(data);
-                       List possibleBeans = 
storageManager.getRMSBeanMgr().find(finderRMS);
+                       possibleBeans = 
storageManager.getRMSBeanMgr().find(finderRMS);
                        
                        //try looking for RMD beans too
                        RMDBean finderRMD = new RMDBean();
@@ -121,8 +125,8 @@
                        if(size>0){
                                //select one at random: TODO better method?
                                Random random = new Random ();
-                               int itemToPick = random.nextInt(size);
-                               RMSequenceBean selectedSequence = 
(RMSequenceBean)possibleBeans.get(itemToPick);
+                               possibleBeanIndex = random.nextInt(size);
+                               RMSequenceBean selectedSequence = 
(RMSequenceBean)possibleBeans.get(possibleBeanIndex);
                                
findSenderBean.setSequenceID(selectedSequence.getSequenceID());
                                if(log.isDebugEnabled()) log.debug("sequence 
selected " + findSenderBean.getSequenceID());
                        }
@@ -132,7 +136,8 @@
                                //return false; //TODO put this in once tested 
live
                        }
                }
-                       
+               
+               
                //lookup a sender bean
                SenderBeanMgr senderBeanMgr = storageManager.getSenderBeanMgr();
                
@@ -148,47 +153,74 @@
                        
findSenderBean.setSequenceID(identifier.getIdentifier());
                }
                
-               // Set the time to send field to be now
-               findSenderBean.setTimeToSend(System.currentTimeMillis());
-               
-               //finding the beans that go with the criteria of the passed 
SenderBean
-               //The reSend flag is ignored for this selection, so there is no 
need to
-               //set it.
-               Collection collection = senderBeanMgr.find(findSenderBean);
-               
-               //removing beans that does not pass the resend test
-               for (Iterator it=collection.iterator();it.hasNext();) {
-                       SenderBean bean = (SenderBean) it.next();
-                       if (!bean.isReSend() && bean.getSentCount()>0)
-                               it.remove();
-               }
-               
-               //selecting a bean to send RANDOMLY. TODO- Should use a better 
mechanism.
-               int size = collection.size();
-               int itemToPick=-1;
-               
+               SenderBean senderBean = null;
                boolean pending = false;
-               if (size>0) {
-                       Random random = new Random ();
-                       itemToPick = random.nextInt(size);
-               }
+               while (true){
+                       // Set the time to send field to be now
+                       
findSenderBean.setTimeToSend(System.currentTimeMillis());
+                       
+                       //finding the beans that go with the criteria of the 
passed SenderBean
+                       //The reSend flag is ignored for this selection, so 
there is no need to
+                       //set it.
+                       Collection collection = 
senderBeanMgr.find(findSenderBean);
+                       
+                       //removing beans that does not pass the resend test
+                       for (Iterator it=collection.iterator();it.hasNext();) {
+                               SenderBean bean = (SenderBean) it.next();
+                               if (!bean.isReSend() && bean.getSentCount()>0)
+                                       it.remove();
+                       }
+                       
+                       //selecting a bean to send RANDOMLY. TODO- Should use a 
better mechanism.
+                       int size = collection.size();
+                       int itemToPick=-1;
+                       
+                       pending = false;
+                       if (size>0) {
+                               Random random = new Random ();
+                               itemToPick = random.nextInt(size);
+                       }
 
-               if (size>1)
-                       pending = true;  //there are more than one message to 
be delivered using the makeConnection.
-                                                        //So the 
MessagePending header should have value true;
-               
-               Iterator it = collection.iterator();
-               
-               SenderBean senderBean = null;
-               for (int item=0;item<size;item++) {
-                   senderBean = (SenderBean) it.next();
-                       if (item==itemToPick)
+                       if (size>1)
+                               pending = true;  //there are more than one 
message to be delivered using the makeConnection.
+                                                                //So the 
MessagePending header should have value true;
+                       
+                       Iterator it = collection.iterator();
+                       
+                       senderBean = null;
+                       for (int item=0;item<size;item++) {
+                           senderBean = (SenderBean) it.next();
+                               if (item==itemToPick)
+                                       break;
+                       }
+                       
+                       if (senderBean==null) {
+                               //If secured try another sequence
+                               //Remove old one from the list and pick another 
random one
+                               if(secured){
+                                       possibleBeans.remove(possibleBeanIndex);
+                                       int possBeansSize = 
possibleBeans.size();
+                                       
+                                       if(possBeansSize > 0){
+                                               //select one at random: TODO 
better method?
+                                               Random random = new Random ();
+                                               possibleBeanIndex = 
random.nextInt(possBeansSize);
+                                               RMSequenceBean selectedSequence 
= (RMSequenceBean)possibleBeans.get(possibleBeanIndex);
+                                               
findSenderBean.setSequenceID(selectedSequence.getSequenceID());
+                                               if(log.isDebugEnabled()) 
log.debug("sequence selected " + findSenderBean.getSequenceID());
+                                       }
+                                       else{
+                                               if(log.isDebugEnabled()) 
log.debug("Exit: MakeConnectionProcessor::processInMessage, no matching message 
found");
+                                               return false;
+                                       }
+                                       
+                               } else {
+                                       if(log.isDebugEnabled()) 
log.debug("Exit: MakeConnectionProcessor::processInMessage, no matching message 
found");
+                                       return false;
+                               }
+                       } else {
                                break;
-               }
-
-               if (senderBean==null) {
-                       if(log.isDebugEnabled()) log.debug("Exit: 
MakeConnectionProcessor::processInMessage, no matching message found");
-                       return false;
+                       }
                }
        
                if (transaction != null && transaction.isActive()) {



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

Reply via email to