You are viewing a plain text version of this content. The canonical link for it is here.
Posted to sandesha-dev@ws.apache.org by ga...@apache.org on 2008/12/02 11:26:41 UTC

svn commit: r722413 - in /webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2: msgprocessors/MakeConnectionProcessor.java workers/SenderWorker.java

Author: gatfora
Date: Tue Dec  2 02:26:40 2008
New Revision: 722413

URL: http://svn.apache.org/viewvc?rev=722413&view=rev
Log:
Applying patch for SANDESHA2-183, thanks Dave

Modified:
    webservices/sandesha/trunk/java/modules/core/src/main/java/org/apache/sandesha2/msgprocessors/MakeConnectionProcessor.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/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=722413&r1=722412&r2=722413&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 Tue Dec  2 02:26:40 2008
@@ -80,156 +80,171 @@
 	public boolean processInMessage(RMMsgContext rmMsgCtx, Transaction transaction) throws AxisFault {
 		if(LoggingControl.isAnyTracingEnabled() && log.isDebugEnabled()) log.debug("Enter: MakeConnectionProcessor::processInMessage " + rmMsgCtx.getSOAPEnvelope().getBody());
 
-		MakeConnection makeConnection = rmMsgCtx.getMakeConnection();
-		
-		String address = makeConnection.getAddress();
-		Identifier identifier = makeConnection.getIdentifier();
-		
-		// If there is no address or identifier - make the MissingSelection Fault.
-		if (address == null && identifier == null)
-			FaultManager.makeMissingSelectionFault(rmMsgCtx);
-		
-		if (makeConnection.getUnexpectedElement() != null)
-			FaultManager.makeUnsupportedSelectionFault(rmMsgCtx, makeConnection.getUnexpectedElement());
-		
-		//some initial setup
-		ConfigurationContext configurationContext = rmMsgCtx.getConfigurationContext();
-		StorageManager storageManager = SandeshaUtil.getSandeshaStorageManager(configurationContext,configurationContext.getAxisConfiguration());
-		SecurityManager secManager = SandeshaUtil.getSecurityManager(configurationContext);
-		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(LoggingControl.isAnyTracingEnabled() && 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);
-			possibleBeans = storageManager.getRMSBeanMgr().find(finderRMS);
-			
-			//try looking for RMD beans too
-			RMDBean finderRMD = new RMDBean();
-			finderRMD.setSecurityTokenData(data);
-			List<RMDBean> tempList = storageManager.getRMDBeanMgr().find(finderRMD);
-			
-			//combine these two into one list
-			possibleBeans.addAll(tempList);
-			
-			int size = possibleBeans.size();
-			
-			if(size>0){
-				//select one at random: TODO better method?
-				Random random = new Random ();
-				possibleBeanIndex = random.nextInt(size);
-				RMSequenceBean selectedSequence = (RMSequenceBean)possibleBeans.get(possibleBeanIndex);
-				findSenderBean.setSequenceID(selectedSequence.getSequenceID());
-				if(LoggingControl.isAnyTracingEnabled() && log.isDebugEnabled()) log.debug("sequence selected " + findSenderBean.getSequenceID());
-			}
-			else{
-				//we cannot match a RMD with the correct security credentials so we cannot process this msg under RSP
-				if(LoggingControl.isAnyTracingEnabled() && log.isDebugEnabled()) log.debug("Exit: MakeConnectionProcessor::processInMessage : no RM sequence bean with security credentials" );
-				return false; 
-			}
-		}
-		
-		
-		//lookup a sender bean
-		SenderBeanMgr senderBeanMgr = storageManager.getSenderBeanMgr();
-		
-		//selecting the set of SenderBeans that suit the given criteria.
-		findSenderBean.setSend(true);
-		findSenderBean.setTransportAvailable(false);
-		
-		if (address!=null)
-			findSenderBean.setToAddress(address);
-		
-		if (identifier!=null){
-			if(LoggingControl.isAnyTracingEnabled() && log.isDebugEnabled()) log.debug("identifier set, this violates RSP " + identifier);
-			findSenderBean.setSequenceID(identifier.getIdentifier());
-		}
-		
-		SenderBean senderBean = null;
-		boolean pending = false;
-		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<SenderBean> collection = senderBeanMgr.find(findSenderBean);
-			
-			//removing beans that does not pass the resend test
-			for (Iterator<SenderBean> it=collection.iterator();it.hasNext();) {
-				SenderBean bean = (SenderBean) it.next();
-				if (!bean.isReSend() && bean.getSentCount()>0)
-					it.remove();
-			}
+		try {
+					
+			MakeConnection makeConnection = rmMsgCtx.getMakeConnection();
 			
-			//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);
-			}
+			String address = makeConnection.getAddress();
+			Identifier identifier = makeConnection.getIdentifier();
+			
+			// If there is no address or identifier - make the MissingSelection Fault.
+			if (address == null && identifier == null)
+				FaultManager.makeMissingSelectionFault(rmMsgCtx);
+			
+			if (makeConnection.getUnexpectedElement() != null)
+				FaultManager.makeUnsupportedSelectionFault(rmMsgCtx, makeConnection.getUnexpectedElement());
+
+                        //some initial setup
+			ConfigurationContext configurationContext = rmMsgCtx.getConfigurationContext();
+			StorageManager storageManager = SandeshaUtil.getSandeshaStorageManager(configurationContext,configurationContext.getAxisConfiguration());
+			SecurityManager secManager = SandeshaUtil.getSecurityManager(configurationContext);
+			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(LoggingControl.isAnyTracingEnabled() && 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);
+				finderRMS.setToEPR(address);
+				possibleBeans = storageManager.getRMSBeanMgr().find(finderRMS);
+				
+				//try looking for RMD beans too
+				RMDBean finderRMD = new RMDBean();
+				finderRMD.setSecurityTokenData(data);
+				finderRMD.setToAddress(address);
+				List tempList = storageManager.getRMDBeanMgr().find(finderRMD);
+				
+				//combine these two into one list
+				possibleBeans.addAll(tempList);
+				
+				int size = possibleBeans.size();
+				
+				if(size>0){
+					//select one at random: TODO better method?
+					Random random = new Random ();
+					possibleBeanIndex = random.nextInt(size);
+					RMSequenceBean selectedSequence = (RMSequenceBean)possibleBeans.get(possibleBeanIndex);
+					findSenderBean.setSequenceID(selectedSequence.getSequenceID());
+					if(LoggingControl.isAnyTracingEnabled() && log.isDebugEnabled()) log.debug("sequence selected " + findSenderBean.getSequenceID());
+				}
+				else{
+					//we cannot match a RMD with the correct security credentials so we cannot process this msg under RSP
+					if(LoggingControl.isAnyTracingEnabled() && log.isDebugEnabled()) log.debug("Exit: MakeConnectionProcessor::processInMessage : no RM sequence bean with security credentials" );
+					return false; 
+				}
+				
+				// Commit this transaction to clear up held RMS/RMDBeans
+				if (transaction != null && transaction.isActive()) 
+					transaction.commit();			
+				
+				// Get a new transaction
+				transaction = storageManager.getTransaction();			
+ 			}
+
+			//lookup a sender bean
+			SenderBeanMgr senderBeanMgr = storageManager.getSenderBeanMgr();
+			
+			//selecting the set of SenderBeans that suit the given criteria.
+			findSenderBean.setSend(true);
+			findSenderBean.setTransportAvailable(false);
+			
+			if (address!=null)
+				findSenderBean.setToAddress(address);
 
-			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<SenderBean> it = collection.iterator();
-			
-			senderBean = null;
-			for (int item=0;item<size;item++) {
-			    senderBean = (SenderBean) it.next();
-				if (item==itemToPick)
-					break;
+			if (identifier!=null){
+				if(LoggingControl.isAnyTracingEnabled() && log.isDebugEnabled()) log.debug("identifier set, this violates RSP " + identifier);
+				findSenderBean.setSequenceID(identifier.getIdentifier());
 			}
 			
-			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(LoggingControl.isAnyTracingEnabled() && log.isDebugEnabled()) log.debug("sequence selected " + findSenderBean.getSequenceID());
-					}
-					else{
+			SenderBean senderBean = null;
+			boolean pending = false;
+			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 = 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(LoggingControl.isAnyTracingEnabled() && log.isDebugEnabled()) log.debug("sequence selected " + findSenderBean.getSequenceID());
+						}
+						else {
+							if(LoggingControl.isAnyTracingEnabled() && log.isDebugEnabled()) log.debug("Exit: MakeConnectionProcessor::processInMessage, no matching message found");
+							return false;
+						}
+					} else {
 						if(LoggingControl.isAnyTracingEnabled() && log.isDebugEnabled()) log.debug("Exit: MakeConnectionProcessor::processInMessage, no matching message found");
 						return false;
-					}
-					
+					}					
 				} else {
-					if(LoggingControl.isAnyTracingEnabled() && log.isDebugEnabled()) log.debug("Exit: MakeConnectionProcessor::processInMessage, no matching message found");
-					return false;
-				}
-			} else {
-				break;
+                                        break;
+                                }
 			}
-		}
-	
-		if (transaction != null && transaction.isActive()) {
-			transaction.commit();
-			transaction = storageManager.getTransaction();
-		}
-		replyToPoll(rmMsgCtx, senderBean, storageManager, pending, makeConnection.getNamespaceValue(), transaction);
+
+                        if (transaction != null && transaction.isActive()) {
+				transaction.commit();
+				transaction = storageManager.getTransaction();
+			}
+			replyToPoll(rmMsgCtx, senderBean, storageManager, pending, makeConnection.getNamespaceValue(), transaction);
 		
+		} finally {
+			if (transaction != null && transaction.isActive()) {
+				transaction.rollback();
+			}
+		}
+
 		if(LoggingControl.isAnyTracingEnabled() && log.isDebugEnabled()) log.debug("Exit: MakeConnectionProcessor::processInMessage");
 		return false;
 	}

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?rev=722413&r1=722412&r2=722413&view=diff
==============================================================================
--- 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 Tue Dec  2 02:26:40 2008
@@ -231,6 +231,33 @@
 				transaction.commit();			
 			
 			transaction = storageManager.getTransaction();
+
+                        //if this is an sync WSRM 1.0 case we always have to add an ack
+			boolean ackPresent = false;
+			Iterator it = rmMsgCtx.getSequenceAcknowledgements();
+			if (it.hasNext()) 
+				ackPresent = true;
+			
+			if (!ackPresent && rmMsgCtx.getMessageContext().isServerSide() 
+					&&
+				(messageType==Sandesha2Constants.MessageTypes.APPLICATION ||
+			     messageType==Sandesha2Constants.MessageTypes.UNKNOWN ||
+			     messageType==Sandesha2Constants.MessageTypes.LAST_MESSAGE)) {
+				
+				String inboundSequenceId = senderBean.getInboundSequenceId();
+				if (inboundSequenceId==null)
+					throw new SandeshaException ("InboundSequenceID is not set for the sequence:" + senderBean.getSequenceID());
+				
+				RMDBean incomingSequenceBean = SandeshaUtil.getRMDBeanFromSequenceId(storageManager, inboundSequenceId);
+
+				if (incomingSequenceBean!=null)
+					RMMsgCreator.addAckMessage(rmMsgCtx, inboundSequenceId, incomingSequenceBean, false);
+			}
+
+			if (transaction != null && transaction.isActive()) 
+				transaction.commit();			
+			
+			transaction = storageManager.getTransaction();
 			
 			senderBean = updateMessage(rmMsgCtx,senderBean,storageManager);
 
@@ -480,29 +507,6 @@
 		// TODO consider adding an extra ack request, as we are about to send the message and we
 		// know which sequence it is associated with.
 		
-		//if this is an sync WSRM 1.0 case we always have to add an ack
-		boolean ackPresent = false;
-		Iterator<SequenceAcknowledgement> it = rmMsgContext.getSequenceAcknowledgements();
-		if (it.hasNext()) 
-			ackPresent = true;
-		
-		if (!ackPresent && rmMsgContext.getMessageContext().isServerSide() 
-				&&
-			(messageType==Sandesha2Constants.MessageTypes.APPLICATION || 
-		     messageType==Sandesha2Constants.MessageTypes.APPLICATION ||
-		     messageType==Sandesha2Constants.MessageTypes.UNKNOWN ||
-		     messageType==Sandesha2Constants.MessageTypes.LAST_MESSAGE)) {
-			
-			String inboundSequenceId = senderBean.getInboundSequenceId();
-			if (inboundSequenceId==null)
-				throw new SandeshaException ("InboundSequenceID is not set for the sequence:" + id);
-			
-			RMDBean incomingSequenceBean = SandeshaUtil.getRMDBeanFromSequenceId(storageManager, inboundSequenceId);
-
-			if (incomingSequenceBean!=null)
-				RMMsgCreator.addAckMessage(rmMsgContext, inboundSequenceId, incomingSequenceBean, false);
-		}
-
 		if(id != null && !senderBean.getSequenceID().equals(id.getIdentifier())) {
 			id.setIndentifer(senderBean.getSequenceID());
 



---------------------------------------------------------------------
To unsubscribe, e-mail: sandesha-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: sandesha-dev-help@ws.apache.org