Author: gatfora
Date: Mon Feb 19 02:50:09 2007
New Revision: 509152

URL: http://svn.apache.org/viewvc?view=rev&rev=509152
Log:
Notify waiting clients that a sequence has timed out

Added:
    
webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/faulttests/SequenceTimedOutTest.java
Modified:
    
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/FaultManager.java
    
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/MessageRetransmissionAdjuster.java
    
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SequenceManager.java

Modified: 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/FaultManager.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/FaultManager.java?view=diff&rev=509152&r1=509151&r2=509152
==============================================================================
--- 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/FaultManager.java 
(original)
+++ 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/FaultManager.java 
Mon Feb 19 02:50:09 2007
@@ -55,8 +55,7 @@
 import org.apache.sandesha2.client.SandeshaListener;
 import org.apache.sandesha2.i18n.SandeshaMessageHelper;
 import org.apache.sandesha2.i18n.SandeshaMessageKeys;
-import org.apache.sandesha2.security.SecurityManager;
-import org.apache.sandesha2.security.SecurityToken;
+import org.apache.sandesha2.storage.SandeshaStorageException;
 import org.apache.sandesha2.storage.StorageManager;
 import org.apache.sandesha2.storage.beanmanagers.RMSBeanMgr;
 import org.apache.sandesha2.storage.beanmanagers.SenderBeanMgr;
@@ -648,43 +647,51 @@
 
                RMSBean rmsBean = rmsBeanMgr.retrieve(createSeqMsgId);
                if (rmsBean == null) {
-                       String message = 
SandeshaMessageHelper.getMessage(SandeshaMessageKeys.createSeqEntryNotFound);
-                       log.debug(message);
-                       throw new SandeshaException(message);
-               }
-
-               // Check that the create sequence response message proves 
possession of the correct token
-               String tokenData = rmsBean.getSecurityTokenData();
-               if(tokenData != null) {
-                       SecurityManager secManager = 
SandeshaUtil.getSecurityManager(configCtx);
-                       MessageContext crtSeqResponseCtx = 
rmMsgCtx.getMessageContext();
-                       OMElement body = 
crtSeqResponseCtx.getEnvelope().getBody();
-                       SecurityToken token = 
secManager.recoverSecurityToken(tokenData);
-                       secManager.checkProofOfPossession(token, body, 
crtSeqResponseCtx);
+                       if (log.isDebugEnabled())
+                               log.debug("Exit: 
FaultManager::processCreateSequenceRefusedFault Unable to find RMSBean");
+                       return;
                }
-
-               String internalSequenceId = rmsBean.getInternalSequenceID();
-               if (internalSequenceId == null || 
"".equals(internalSequenceId)) {
-                       String message = 
SandeshaMessageHelper.getMessage(SandeshaMessageKeys.tempSeqIdNotSet);
-                       log.debug(message);
-                       throw new SandeshaException(message);
+               
+       /*      if (rmsBean.getLastSendError() == null) {
+                       // Indicate that there was an error when sending the 
Create Sequence.
+                       rmsBean.setLastSendError(fault);
+                       
+                       // Update the RMSBean
+                       rmsBeanMgr.update(rmsBean);
+                       if (log.isDebugEnabled())
+                               log.debug("Exit: 
FaultManager::processCreateSequenceRefusedFault Allowing another CreateSequence 
attempt");
+                       return;
                }
-               
rmMsgCtx.setProperty(Sandesha2Constants.MessageContextProperties.INTERNAL_SEQUENCE_ID,internalSequenceId);
-
+*/
                SenderBean createSequenceSenderBean = 
retransmitterMgr.retrieve(createSeqMsgId);
                if (createSequenceSenderBean == null)
                        throw new 
SandeshaException(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.createSeqEntryNotFound));
 
                // deleting the create sequence entry.
                retransmitterMgr.delete(createSeqMsgId);
-                                               
+                       
+               // Notify the clients of a failure
+               notifyClientsOfFault(rmsBean.getInternalSequenceID(), 
storageManager, configCtx, fault);
+               
+               rmMsgCtx.pause();
+               
+               // Cleanup sending side.
+               if (log.isDebugEnabled())
+                       log.debug("Terminating sending sequence " + rmsBean);
+               TerminateManager.terminateSendingSide(rmsBean, storageManager);
+
+               if (log.isDebugEnabled())
+                       log.debug("Exit: 
FaultManager::processCreateSequenceRefusedFault");
+       }
+       
+       static void notifyClientsOfFault(String internalSequenceId, 
+                       StorageManager storageManager, ConfigurationContext 
configCtx, AxisFault fault) throws SandeshaStorageException {
                // Locate and update all of the messages for this sequence, now 
that we know
                // the sequence id.
                SenderBean target = new SenderBean();
                target.setInternalSequenceID(internalSequenceId);
-               target.setSend(false);
                
-               Iterator iterator = retransmitterMgr.find(target).iterator();
+               Iterator iterator = 
storageManager.getSenderBeanMgr().find(target).iterator();
                while (iterator.hasNext()) {
                        SenderBean tempBean = (SenderBean) iterator.next();
 
@@ -707,15 +714,6 @@
         }
       }
                }
-               
-               rmMsgCtx.pause();
-               
-               // Cleanup sending side.
-               if (log.isDebugEnabled())
-                       log.debug("Terminating sending sequence " + rmsBean);
-               TerminateManager.terminateSendingSide(rmsBean, storageManager);
 
-               if (log.isDebugEnabled())
-                       log.debug("Exit: 
FaultManager::processCreateSequenceRefusedFault");
        }
 }

Modified: 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/MessageRetransmissionAdjuster.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/MessageRetransmissionAdjuster.java?view=diff&rev=509152&r1=509151&r2=509152
==============================================================================
--- 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/MessageRetransmissionAdjuster.java
 (original)
+++ 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/MessageRetransmissionAdjuster.java
 Mon Feb 19 02:50:09 2007
@@ -29,6 +29,8 @@
 import org.apache.sandesha2.client.SandeshaClientConstants;
 import org.apache.sandesha2.client.SandeshaListener;
 import org.apache.sandesha2.client.SequenceReport;
+import org.apache.sandesha2.i18n.SandeshaMessageHelper;
+import org.apache.sandesha2.i18n.SandeshaMessageKeys;
 import org.apache.sandesha2.policy.SandeshaPolicyBean;
 import org.apache.sandesha2.storage.StorageManager;
 import org.apache.sandesha2.storage.beans.SenderBean;
@@ -70,20 +72,21 @@
                        if (maxRetransmissionAttempts >= 0 && 
retransmitterBean.getSentCount() > maxRetransmissionAttempts)
                                timeOutSequence = true;
 
-                       boolean sequenceTimedOut = 
SequenceManager.hasSequenceTimedOut(internalSequenceID, rmMsgCtx, 
storageManager);
-                       if (sequenceTimedOut)
-                               timeOutSequence = true;
+                       if (!timeOutSequence)
+                               timeOutSequence = 
SequenceManager.hasSequenceTimedOut(internalSequenceID, rmMsgCtx, 
storageManager);
 
                        if (timeOutSequence) {
+       
+                               retransmitterBean.setSend(false);
+
                                // Warn the user that the sequence has timed out
                                //if (log.isWarnEnabled())
                                //      log.warn();
-                               stopRetransmission(retransmitterBean);
 
                                // Only messages of outgoing sequences get 
retransmitted. So named
                                // following method according to that.
                                
-                               finalizeTimedOutSequence(internalSequenceID, 
sequenceID, rmMsgCtx.getMessageContext(), storageManager);
+                               finalizeTimedOutSequence(internalSequenceID, 
rmMsgCtx.getMessageContext(), storageManager);
                                continueSending = false;
                        }
                }
@@ -125,10 +128,6 @@
                return retransmitterBean;
        }
 
-       private static void stopRetransmission(SenderBean bean) {
-               bean.setSend(false);
-       }
-
        private static long generateNextExponentialBackedoffDifference(int 
count, long initialInterval) {
                long interval = initialInterval;
                for (int i = 1; i < count; i++) {
@@ -138,17 +137,23 @@
                return interval;
        }
 
-       private static void finalizeTimedOutSequence(String internalSequenceID, 
String sequenceID, MessageContext messageContext,
+       private static void finalizeTimedOutSequence(String internalSequenceID, 
MessageContext messageContext,
                        StorageManager storageManager) throws SandeshaException 
{
                ConfigurationContext configurationContext = 
messageContext.getConfigurationContext();
 
+               // Notify the clients of a timeout
+               AxisFault fault = new AxisFault(
+                               
SandeshaMessageHelper.getMessage(SandeshaMessageKeys.cannotSendMsgAsSequenceTimedout,
 internalSequenceID));
+               // Notify any waiting clients that the sequence has timeed out.
+               FaultManager.notifyClientsOfFault(internalSequenceID, 
storageManager, configurationContext, fault);
+               
                // Already an active transaction, so don't want a new one
-               SequenceReport report = 
SandeshaClient.getOutgoingSequenceReport(internalSequenceID, 
configurationContext, false);
                TerminateManager.timeOutSendingSideSequence(internalSequenceID, 
storageManager);
 
                SandeshaListener listener = (SandeshaListener) messageContext
                                
.getProperty(SandeshaClientConstants.SANDESHA_LISTENER);
                if (listener != null) {
+                       SequenceReport report = 
SandeshaClient.getOutgoingSequenceReport(internalSequenceID, 
configurationContext, false);
                        listener.onTimeOut(report);
                }
        }

Modified: 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SequenceManager.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SequenceManager.java?view=diff&rev=509152&r1=509151&r2=509152
==============================================================================
--- 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SequenceManager.java
 (original)
+++ 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SequenceManager.java
 Mon Feb 19 02:50:09 2007
@@ -1,8 +1,18 @@
 /*
- * Created on Sep 5, 2005
+ * Copyright  1999-2004 The Apache Software Foundation.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
  *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Style - Code Templates
  */
 package org.apache.sandesha2.util;
 

Added: 
webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/faulttests/SequenceTimedOutTest.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/faulttests/SequenceTimedOutTest.java?view=auto&rev=509152
==============================================================================
--- 
webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/faulttests/SequenceTimedOutTest.java
 (added)
+++ 
webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/faulttests/SequenceTimedOutTest.java
 Mon Feb 19 02:50:09 2007
@@ -0,0 +1,140 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.sandesha2.faulttests;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Iterator;
+
+import org.apache.axis2.Constants;
+import org.apache.axis2.addressing.AddressingConstants;
+import org.apache.axis2.addressing.EndpointReference;
+import org.apache.axis2.client.Options;
+import org.apache.axis2.client.ServiceClient;
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.context.ConfigurationContextFactory;
+import org.apache.axis2.description.AxisOperation;
+import org.apache.axis2.description.AxisService;
+import org.apache.sandesha2.SandeshaTestCase;
+import org.apache.sandesha2.client.SandeshaClient;
+import org.apache.sandesha2.client.SandeshaClientConstants;
+import org.apache.sandesha2.client.SequenceReport;
+import org.apache.sandesha2.policy.SandeshaPolicyBean;
+import org.apache.sandesha2.util.SandeshaUtil;
+
+public class SequenceTimedOutTest extends SandeshaTestCase {
+       
+       public SequenceTimedOutTest() {
+               super("SequenceTimedOutTest");
+       }
+
+       public void setUp() throws Exception {
+               super.setUp();
+       }
+       
+       public void tearDown() {
+               
+       }
+       
+       /**
+        * Test to check that when a sequence times out - that we alert the 
client to the
+        * fact that the sequence has now gone.
+        * 
+        * @throws Exception
+        */
+       public void testSOAP11CreateSequenceRefusedInboundFault () throws 
Exception {
+               
+               String to = "http://127.0.0.1:"; + 9999 + 
"/axis2/services/RMSampleService";
+               
+               String repoPath = "target" + File.separator + "repos" + 
File.separator + "client";
+               String axis2_xml = "target" + File.separator + "repos" + 
File.separator + "client" + File.separator + "client_axis2.xml";
+               
+               ConfigurationContext configContext = 
ConfigurationContextFactory.createConfigurationContextFromFileSystem(repoPath,axis2_xml);
          
+               
+               Options clientOptions = new Options ();
+               clientOptions.setAction(echoAction);
+               clientOptions.setTo(new EndpointReference (to));
+
+               String sequenceKey = SandeshaUtil.getUUID();
+               
clientOptions.setProperty(SandeshaClientConstants.SEQUENCE_KEY,sequenceKey);
+               
+               ServiceClient serviceClient = new ServiceClient 
(configContext,null);
+               
+
+               HashMap axisServices = 
configContext.getAxisConfiguration().getServices();
+               
+               AxisService service = null;
+               Iterator values = axisServices.values().iterator();
+               while(values.hasNext())
+                       service = (AxisService)values.next();
+
+               // Set the Sequence timout property to 1 second.
+    Iterator operations = service.getOperations();
+    
+    while (operations.hasNext())
+    {
+       AxisOperation op = (AxisOperation) operations.next();
+               SandeshaPolicyBean propertyBean = 
+                       SandeshaUtil.getPropertyBean(op);
+
+               // Indicate that the sequence should timeout after 1 second
+               if (propertyBean != null)
+                       propertyBean.setInactiveTimeoutInterval(1, "seconds");
+    }
+               
+               // Set a bad acks to so the CreateSequence will be refused.
+               String acksTo = AddressingConstants.Final.WSA_NONE_URI;
+               
clientOptions.setProperty(SandeshaClientConstants.AcksTo,acksTo);
+               
+               clientOptions.setTransportInProtocol(Constants.TRANSPORT_HTTP);
+               clientOptions.setUseSeparateListener(true);             
+               clientOptions.setProperty(SandeshaClientConstants.LAST_MESSAGE, 
"true");
+               serviceClient.setOptions(clientOptions);                
+               
+               TestCallback callback1 = new TestCallback ("Callback 1");
+               serviceClient.sendReceiveNonBlocking 
(getEchoOMBlock("echo1",sequenceKey),callback1);
+        
+               long limit = System.currentTimeMillis() + waitTime;
+               Error lastError = null;
+               while(System.currentTimeMillis() < limit) {
+                       Thread.sleep(tickTime); // Try the assertions each tick 
interval, until they pass or we time out
+                       
+                       try {
+                       //assertions for the out sequence.
+                               SequenceReport sequenceReport = 
SandeshaClient.getOutgoingSequenceReport(serviceClient);
+                               
assertEquals(sequenceReport.getSequenceStatus(),SequenceReport.SEQUENCE_STATUS_TIMED_OUT);
+                               
assertEquals(sequenceReport.getSequenceDirection(),SequenceReport.SEQUENCE_DIRECTION_OUT);
+                               
+                               assertTrue(callback1.isErrorRported());
+                               assertEquals(callback1.getResult(),null);
+                               
+                               lastError = null;
+                               break;
+                       } catch(Error e) {
+                               lastError = e;
+                       }
+               }
+
+               if(lastError != null) throw lastError;
+
+               configContext.getListenerManager().stop();
+               serviceClient.cleanup();
+
+       }
+       
+}
+



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

Reply via email to