Author: gatfora
Date: Fri Dec 22 05:39:43 2006
New Revision: 489651

URL: http://svn.apache.org/viewvc?view=rev&rev=489651
Log:
Allow client to create a sequence over a sequence that was previously terminated

Modified:
    
webservices/sandesha/trunk/java/src/org/apache/sandesha2/client/SandeshaClient.java
    
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/MessageRetransmissionAdjuster.java
    
webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/SandeshaClientTest.java

Modified: 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/client/SandeshaClient.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/client/SandeshaClient.java?view=diff&rev=489651&r1=489650&r2=489651
==============================================================================
--- 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/client/SandeshaClient.java
 (original)
+++ 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/client/SandeshaClient.java
 Fri Dec 22 05:39:43 2006
@@ -19,6 +19,7 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
+import java.util.List;
 import java.util.MissingResourceException;
 
 import javax.xml.namespace.QName;
@@ -45,6 +46,7 @@
 import org.apache.sandesha2.SandeshaException;
 import org.apache.sandesha2.i18n.SandeshaMessageHelper;
 import org.apache.sandesha2.i18n.SandeshaMessageKeys;
+import org.apache.sandesha2.storage.SandeshaStorageException;
 import org.apache.sandesha2.storage.StorageManager;
 import org.apache.sandesha2.storage.Transaction;
 import org.apache.sandesha2.storage.beanmanagers.RMSBeanMgr;
@@ -324,22 +326,108 @@
                String oldAction = options.getAction();
                
options.setAction(SpecSpecificConstants.getCreateSequenceAction(rmSpecVersion));
                
+               ServiceContext serviceContext = 
serviceClient.getServiceContext();
+               if (serviceContext == null)
+                       throw new 
SandeshaException(SandeshaMessageHelper.getMessage(
+                                       
SandeshaMessageKeys.serviceContextNotSet));
+
+               ConfigurationContext configurationContext = 
serviceContext.getConfigurationContext();
+
+               // cleanup previous sequence
+               cleanupTerminatedSequence(to, oldSequenceKey, 
SandeshaUtil.getSandeshaStorageManager(configurationContext, 
configurationContext.getAxisConfiguration()));
+               
                try {                   
                        //just to inform the sender.
                        serviceClient.fireAndForget (null);
                } catch (AxisFault e) {
                        throw new SandeshaException(e);
                }
-
-               options.setAction(oldAction);
-               
-               options.setProperty(SandeshaClientConstants.DUMMY_MESSAGE, 
Sandesha2Constants.VALUE_FALSE);
-               options.setProperty(SandeshaClientConstants.SEQUENCE_KEY, 
oldSequenceKey);
+               finally {
+                       options.setAction(oldAction);
+                       
+                       
options.setProperty(SandeshaClientConstants.DUMMY_MESSAGE, 
Sandesha2Constants.VALUE_FALSE);
+                       
options.setProperty(SandeshaClientConstants.SEQUENCE_KEY, oldSequenceKey);
+               }
                
                if (log.isDebugEnabled())
                        log.debug("Exit: SandeshaClient::createSequence");
        }
 
+       /**
+        * If a user has requested to create a new sequence which was 
previously terminated, we need to clean up
+        * any previous properties that might have been stored.
+        * @param to
+        * @param sequenceKey
+        * @throws SandeshaStorageException 
+        */
+       private static final void cleanupTerminatedSequence(String to, String 
sequenceKey, StorageManager storageManager) throws SandeshaException {
+               String internalSequenceId = 
SandeshaUtil.getInternalSequenceID(to, sequenceKey);
+               
+               if (log.isTraceEnabled())
+                       log.trace("Checking if sequence " + internalSequenceId 
+ " previously terminated");
+               
+               Transaction tran = storageManager.getTransaction();
+               
+               try {
+                       
+                       SequencePropertyBeanMgr seqPropMgr = 
storageManager.getSequencePropertyBeanMgr();
+                       
+                       boolean terminatedSequence = false;
+                       
+                       //see if the sequence is terminated
+                       SequencePropertyBean sequenceTerminated = 
seqPropMgr.retrieve(internalSequenceId, 
Sandesha2Constants.SequenceProperties.TERMINATE_ADDED);
+                       if(sequenceTerminated!=null){
+                               terminatedSequence = true;
+                       }
+       
+                       //see if the sequence is timed out
+                       SequencePropertyBean sequenceTimedout = 
seqPropMgr.retrieve(internalSequenceId, 
Sandesha2Constants.SequenceProperties.SEQUENCE_TIMED_OUT);
+                       if(sequenceTimedout!=null){
+                               terminatedSequence = true;
+                       }
+       
+                       if (terminatedSequence) {               
+                               // We need to find out the original sequence id 
for this sequence by doing a backwards lookup
+                               SequencePropertyBean bean = new 
SequencePropertyBean();
+                               
bean.setName(Sandesha2Constants.SequenceProperties.INTERNAL_SEQUENCE_ID);
+                               bean.setValue(internalSequenceId);
+                               bean = seqPropMgr.findUnique(bean);
+                               
+                               String sequenceId = null;
+                               if (bean != null)
+                                 sequenceId = bean.getSequencePropertyKey(); 
+                               
+                               // Find all properties which have a matching 
internal sequence id                               
+                               removeBeans(sequenceId, seqPropMgr);
+                               removeBeans(internalSequenceId, seqPropMgr);
+                       }
+               
+               } catch (SandeshaException e) {
+                       tran.rollback();
+                       tran = null;
+                       
+                       throw e;
+               } 
+               
+               tran.commit();
+       }
+       
+       private static final void removeBeans(String sequenceId, 
SequencePropertyBeanMgr seqPropMgr) throws SandeshaStorageException {
+               // Find all properties which have a matching sequence id
+               SequencePropertyBean bean = new SequencePropertyBean();
+               bean.setSequencePropertyKey(sequenceId);
+               List beans = seqPropMgr.find(bean);
+               
+               Iterator iterator = beans.iterator();
+               
+               while (iterator.hasNext()) {
+                       bean = (SequencePropertyBean)iterator.next();
+                       
+                       seqPropMgr.delete(bean.getSequencePropertyKey(), 
bean.getName());                               
+               }
+
+       }
+       
        /**
         * Clients can use this to create a sequence sequence.
         * 

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=489651&r1=489650&r2=489651
==============================================================================
--- 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/MessageRetransmissionAdjuster.java
 (original)
+++ 
webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/MessageRetransmissionAdjuster.java
 Fri Dec 22 05:39:43 2006
@@ -74,6 +74,9 @@
 
                boolean continueSending = true;
                if (timeOutSequence) {
+                       // 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

Modified: 
webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/SandeshaClientTest.java
URL: 
http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/SandeshaClientTest.java?view=diff&rev=489651&r1=489650&r2=489651
==============================================================================
--- 
webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/SandeshaClientTest.java
 (original)
+++ 
webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/SandeshaClientTest.java
 Fri Dec 22 05:39:43 2006
@@ -454,9 +454,81 @@
                finally {
                        configContext.getListenerManager().stop();
                        serviceClient.cleanup();                        
-               }
+               }               
+       }
+       
+  /**
+        * Checks the following scenario
+        * 
+        * 1) send an application message (will generate the create sequence)
+        * 2) terminate the sequence
+        * 3) Issue wait until sequence completed (with a wait time)
+        * 4) Create a new sequence
+        * 5) send another application message 
+        * 6) terminate the sequence
+        * 7) Ensure that the sequence was terminated
+        * 
+        */
+       public void testTerminateCreateWithWait () throws Exception {
+
+               startServer(server_repoPath, server_axis2_xml);
+
+               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(pingAction);
+               
clientOptions.setSoapVersionURI(SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);
+          clientOptions.setProperty(SandeshaClientConstants.RM_SPEC_VERSION, 
+              Sandesha2Constants.SPEC_VERSIONS.v1_1);
+               clientOptions.setTo(new EndpointReference (to));
+               
+               ServiceClient serviceClient = new ServiceClient 
(configContext,null);
+               
+               String acksTo = 
serviceClient.getMyEPR(Constants.TRANSPORT_HTTP).getAddress();
+               
clientOptions.setProperty(SandeshaClientConstants.AcksTo,acksTo);
+               clientOptions.setTransportInProtocol(Constants.TRANSPORT_HTTP);
+                       //serviceClient.
+               serviceClient.setOptions(clientOptions);
+                       
+               try{
+                       // 1) Send the application message
+                       serviceClient.fireAndForget(getPingOMBlock("ping1"));
+               
+                       // 2) Terminate the sequence
+                       SandeshaClient.terminateSequence(serviceClient);
+
+                       // 3) wait for the sequence completion (30 second wait)
+                       
SandeshaClient.waitUntilSequenceCompleted(serviceClient, 30000);
+
+                       // 4) Create a new Sequence to the same endpoint
+                       SandeshaClient.createSequence(serviceClient, false, 
null);
+                       
+                       // 5) Send the second application message (this should 
use a new sequence)
+                       serviceClient.fireAndForget(getPingOMBlock("ping2"));   
                
+
+                       // 6) Terminate the sequence
+                       SandeshaClient.terminateSequence(serviceClient);
+
+                       // 7) wait for the sequence completion (30 second wait)
+                       
SandeshaClient.waitUntilSequenceCompleted(serviceClient, 30000);
+
+                       // 8) Check that the sequence has terminated
+                       SequenceReport report = 
SandeshaClient.getOutgoingSequenceReport(serviceClient);
+                       assertNotNull(report);
+                       assertEquals(SequenceReport.SEQUENCE_STATUS_TERMINATED, 
report.getSequenceStatus());
+
+               }
+               finally {
+                       configContext.getListenerManager().stop();
+                       serviceClient.cleanup();                        
+               }               
        }
+
 //     
 //     public void testCloseSequence () {
 //             



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

Reply via email to