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