Author: chamikara
Date: Sat Apr  8 11:21:08 2006
New Revision: 392569

URL: http://svn.apache.org/viewcvs?rev=392569&view=rev
Log:
Adding new classes

Added:
    
webservices/sandesha/trunk/src/org/apache/sandesha2/client/SandeshaClient.java
    
webservices/sandesha/trunk/src/org/apache/sandesha2/client/SandeshaClientConstants.java
    
webservices/sandesha/trunk/src/org/apache/sandesha2/client/SandeshaFaultCallback.java
    
webservices/sandesha/trunk/src/org/apache/sandesha2/client/SandeshaReport.java

Added: 
webservices/sandesha/trunk/src/org/apache/sandesha2/client/SandeshaClient.java
URL: 
http://svn.apache.org/viewcvs/webservices/sandesha/trunk/src/org/apache/sandesha2/client/SandeshaClient.java?rev=392569&view=auto
==============================================================================
--- 
webservices/sandesha/trunk/src/org/apache/sandesha2/client/SandeshaClient.java 
(added)
+++ 
webservices/sandesha/trunk/src/org/apache/sandesha2/client/SandeshaClient.java 
Sat Apr  8 11:21:08 2006
@@ -0,0 +1,805 @@
+/*
+ * 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.client;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+
+import javax.xml.namespace.QName;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.soap.SOAP12Constants;
+import org.apache.axiom.soap.SOAPEnvelope;
+import org.apache.axiom.soap.SOAPFactory;
+import org.apache.axiom.soap.SOAPHeaderBlock;
+import org.apache.axiom.soap.impl.llom.soap11.SOAP11Factory;
+import org.apache.axiom.soap.impl.llom.soap12.SOAP12Factory;
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.addressing.EndpointReference;
+import org.apache.axis2.client.OperationClient;
+import org.apache.axis2.client.Options;
+import org.apache.axis2.client.ServiceClient;
+import org.apache.axis2.client.async.AsyncResult;
+import org.apache.axis2.client.async.Callback;
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.context.OperationContext;
+import org.apache.axis2.context.ServiceContext;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.sandesha2.Sandesha2Constants;
+import org.apache.sandesha2.SandeshaException;
+import org.apache.sandesha2.storage.StorageManager;
+import org.apache.sandesha2.storage.Transaction;
+import org.apache.sandesha2.storage.beanmanagers.CreateSeqBeanMgr;
+import org.apache.sandesha2.storage.beanmanagers.NextMsgBeanMgr;
+import org.apache.sandesha2.storage.beanmanagers.SequencePropertyBeanMgr;
+import org.apache.sandesha2.storage.beans.CreateSeqBean;
+import org.apache.sandesha2.storage.beans.NextMsgBean;
+import org.apache.sandesha2.storage.beans.SequencePropertyBean;
+import org.apache.sandesha2.util.AcknowledgementManager;
+import org.apache.sandesha2.util.SandeshaUtil;
+import org.apache.sandesha2.util.SpecSpecificConstants;
+import org.apache.sandesha2.wsrm.AckRequested;
+import org.apache.sandesha2.wsrm.CloseSequence;
+import org.apache.sandesha2.wsrm.Identifier;
+import org.apache.sandesha2.wsrm.TerminateSequence;
+
+/**
+ * Contains all the Sandesha2Constants of Sandesha2.
+ * Please see sub-interfaces to see grouped data.
+ * 
+ * @author Chamikara Jayalath <[EMAIL PROTECTED]>
+ */
+
+public class SandeshaClient {
+       
+       private static Log log = LogFactory.getLog(SandeshaClient.class);
+       
+       /**
+        * Users can get a SequenceReport of the sequence defined by the 
information given from the
+        * passed serviceClient object.
+        * 
+        * @param serviceClient
+        * @return
+        * @throws SandeshaException
+        */
+       public static SequenceReport getOutgoingSequenceReport (ServiceClient 
serviceClient) throws SandeshaException {
+
+               Options options = serviceClient.getOptions();
+               if (options==null)
+                       throw new SandeshaException ("Options object is not 
set");              
+               
+               EndpointReference toEPR = options.getTo();
+               if (toEPR==null)
+                       throw new SandeshaException ("'To' address is not set");
+               
+               String to = toEPR.getAddress();
+               String sequenceKey = (String) 
options.getProperty(SandeshaClientConstants.SEQUENCE_KEY);
+               
+               ServiceContext serviceContext = 
serviceClient.getServiceContext();
+               if (serviceContext==null)
+                       throw new SandeshaException ("Service Context is null");
+               
+               ConfigurationContext configurationContext = 
serviceContext.getConfigurationContext();
+               String internalSequenceID = 
getInternalSequenceID(to,sequenceKey);
+               
+               return 
getOutgoingSequenceReport(internalSequenceID,configurationContext);
+       }
+       
+       public static void createSequence (ServiceClient serviceClient, boolean 
offer) throws SandeshaException{
+               Options options = serviceClient.getOptions();
+               if (options==null)
+                       throw new SandeshaException ("Options object is not 
set");
+               
+               EndpointReference toEPR = serviceClient.getOptions().getTo();
+               if (toEPR==null)
+                       throw new SandeshaException ("ToEPR is not set");
+               
+               String to = toEPR.getAddress();
+               if (to==null)
+                       throw new SandeshaException ("To EPR is not set");
+               
+               if (offer) {
+                       String offeredSequenceID = SandeshaUtil.getUUID();
+                       
options.setProperty(SandeshaClientConstants.OFFERED_SEQUENCE_ID,offeredSequenceID);
+               }
+               
+               //setting a new squenceKey if not already set.
+               String sequenceKey = (String) 
options.getProperty(SandeshaClientConstants.SEQUENCE_KEY);
+               if (sequenceKey==null) {
+                       sequenceKey = SandeshaUtil.getUUID();
+                       
options.setProperty(SandeshaClientConstants.SEQUENCE_KEY,sequenceKey);
+               }
+               
+           
options.setProperty(SandeshaClientConstants.DUMMY_MESSAGE,Sandesha2Constants.VALUE_TRUE);
+           
+           try {
+                       serviceClient.fireAndForget(null);
+               } catch (AxisFault e) {
+                       throw new SandeshaException (e);
+               }
+               
+               
options.setProperty(SandeshaClientConstants.DUMMY_MESSAGE,Sandesha2Constants.VALUE_FALSE);
+               
+       }
+       
+       public static void createSequnce (ServiceClient serviceClient, boolean 
offer, String sequenceKey) throws SandeshaException {
+               
+               Options options = serviceClient.getOptions();
+               
options.setProperty(SandeshaClientConstants.SEQUENCE_KEY,sequenceKey);
+               
+               createSequence(serviceClient,offer);
+               
+       }
+       
+       /**
+        * Users can get a list of sequenceReports each describing a incoming 
sequence, which are
+        * the sequences the client work as a RMD.
+        * 
+        * @param configCtx
+        * @return
+        * @throws SandeshaException
+        */
+       public static ArrayList getIncomingSequenceReports 
(ConfigurationContext configCtx) throws SandeshaException {
+               
+               SandeshaReport report = getSandeshaReport(configCtx);
+               ArrayList incomingSequenceIDs = 
report.getIncomingSequenceList();
+               Iterator incomingSequenceIDIter = 
incomingSequenceIDs.iterator();
+               
+               ArrayList incomingSequenceReports = new ArrayList ();
+
+               while (incomingSequenceIDIter.hasNext()) {
+                       String sequnceID = (String) 
incomingSequenceIDIter.next();
+                       SequenceReport incomingSequenceReport = 
getIncomingSequenceReport(sequnceID,configCtx);
+                       if (incomingSequenceReport==null) {
+                               throw new SandeshaException ("An incoming 
sequence report is not present for the given sequenceID");
+                       }
+                       incomingSequenceReports.add(incomingSequenceReport);
+               }
+               
+               return incomingSequenceReports;
+       }
+       
+
+       /**
+        * SandeshaReport gives the details of all incoming and outgoing 
sequences.
+        * The outgoing sequence have to pass the initial state (CS/CSR 
exchange) to be included in a SandeshaReport
+        * 
+        * @param configurationContext
+        * @return
+        * @throws SandeshaException
+        */
+       public static SandeshaReport getSandeshaReport (ConfigurationContext 
configurationContext) throws SandeshaException {
+               
+               StorageManager storageManager = 
SandeshaUtil.getSandeshaStorageManager(configurationContext);
+               SequencePropertyBeanMgr seqPropMgr = 
storageManager.getSequencePropretyBeanMgr();
+               SandeshaReport sandeshaReport = new SandeshaReport ();
+               SequencePropertyBean internalSequenceFindBean = new 
SequencePropertyBean ();
+               
internalSequenceFindBean.setName(Sandesha2Constants.SequenceProperties.INTERNAL_SEQUENCE_ID);
+               Collection collection = 
seqPropMgr.find(internalSequenceFindBean);
+               Iterator iterator = collection.iterator();
+               while (iterator.hasNext()) {
+                       SequencePropertyBean bean = (SequencePropertyBean) 
iterator.next();
+                       String sequenceID = bean.getSequenceID();
+                       sandeshaReport.addToOutgoingSequenceList (sequenceID);
+                       
sandeshaReport.addToOutgoingInternalSequenceMap(sequenceID,bean.getValue());
+                       
+                       SequenceReport report = 
getOutgoingSequenceReport(bean.getValue(),configurationContext);
+                       
+                       sandeshaReport.addToNoOfCompletedMessagesMap(sequenceID 
,report.getCompletedMessages().size());
+                       sandeshaReport.addToSequenceStatusMap(sequenceID 
,report.getSequenceStatus());
+               }
+               
+               
+               //incoming sequences
+               SequencePropertyBean serverCompletedMsgsFindBean = new 
SequencePropertyBean ();
+               
serverCompletedMsgsFindBean.setName(Sandesha2Constants.SequenceProperties.SERVER_COMPLETED_MESSAGES);
+               
+               Collection serverCompletedMsgsBeans = 
seqPropMgr.find(serverCompletedMsgsFindBean);
+               Iterator iter = serverCompletedMsgsBeans.iterator();
+               while (iter.hasNext()) {
+                       SequencePropertyBean serverCompletedMsgsBean = 
(SequencePropertyBean) iter.next();
+                       String sequenceID = 
serverCompletedMsgsBean.getSequenceID();
+                       sandeshaReport.addToIncomingSequenceList(sequenceID);
+                       
+                       SequenceReport sequenceReport = 
getIncomingSequenceReport(sequenceID,configurationContext);
+                       
+                       
sandeshaReport.addToNoOfCompletedMessagesMap(sequenceID,sequenceReport.getCompletedMessages().size());
+                       
sandeshaReport.addToSequenceStatusMap(sequenceID,sequenceReport.getSequenceStatus());
+               }
+               
+               return sandeshaReport;
+       }
+       
+       
+       
+       /**
+        * User can terminate the sequence defined by the passed serviceClient.
+        * 
+        * @param serviceClient
+        * @throws SandeshaException
+        */
+       public static void terminateSequence (ServiceClient serviceClient) 
throws SandeshaException {           
+               ServiceContext serviceContext = 
serviceClient.getServiceContext();
+               if (serviceContext==null)
+                       throw new SandeshaException ("ServiceContext is null");
+               
+               Options options = serviceClient.getOptions();
+               if (options==null)
+                       throw new SandeshaException ("Options object is not 
set");
+               
+               String rmSpecVersion = (String) 
options.getProperty(SandeshaClientConstants.RM_SPEC_VERSION);
+
+               if (rmSpecVersion==null) 
+                       rmSpecVersion = 
SpecSpecificConstants.getDefaultSpecVersion ();
+               
+               String rmNamespaceValue = 
SpecSpecificConstants.getRMNamespaceValue(rmSpecVersion);
+               
+               SOAPEnvelope terminateEnvelope = 
configureTerminateSequence(options,serviceContext.getConfigurationContext());
+               OMElement terminateBody = 
terminateEnvelope.getBody().getFirstChildWithName(new QName 
(rmNamespaceValue,Sandesha2Constants.WSRM_COMMON.TERMINATE_SEQUENCE));
+               
+               String oldAction = options.getAction();
+               
options.setAction(SpecSpecificConstants.getTerminateSequenceAction(rmSpecVersion));
+               try {
+                       serviceClient.fireAndForget(terminateBody);
+               } catch (AxisFault e) {
+                       String message = "Could not send the terminate message";
+                       throw new SandeshaException (message,e);
+               } finally {
+                       options.setAction(oldAction);
+               }
+       }
+       
+       /**
+        * User can close the sequence defined by the passed serviceClient.
+        * 
+        * @param serviceClient
+        * @throws SandeshaException
+        */
+       public static void closeSequence (ServiceClient serviceClient) throws 
SandeshaException {
+               ServiceContext serviceContext = 
serviceClient.getServiceContext();
+               if (serviceContext==null)
+                       throw new SandeshaException ("ServiceContext is null");
+               
+               Options options = serviceClient.getOptions();
+               if (options==null)
+                       throw new SandeshaException ("Options object is not 
set");
+               
+               String rmSpecVersion = (String) 
options.getProperty(SandeshaClientConstants.RM_SPEC_VERSION);
+
+               if (rmSpecVersion==null) 
+                       rmSpecVersion = 
SpecSpecificConstants.getDefaultSpecVersion ();
+               
+               String rmNamespaceValue = 
SpecSpecificConstants.getRMNamespaceValue(rmSpecVersion);
+               
+               SOAPEnvelope closeSequnceEnvelope = configureCloseSequence 
(options,serviceContext.getConfigurationContext());
+               OMElement closeSequenceBody = 
closeSequnceEnvelope.getBody().getFirstChildWithName(new QName 
(rmNamespaceValue,Sandesha2Constants.WSRM_COMMON.CLOSE_SEQUENCE));
+               
+               String oldAction = options.getAction();
+               
options.setAction(SpecSpecificConstants.getCloseSequenceAction(rmSpecVersion));
+               try {
+                       serviceClient.fireAndForget(closeSequenceBody);
+               } catch (AxisFault e) {
+                       String message = "Could not send the close sequence 
message";
+                       throw new SandeshaException (message,e);
+               } finally {
+                       options.setAction(oldAction);
+               }
+       }
+
+       private static SOAPEnvelope configureTerminateSequence (Options 
options,ConfigurationContext configurationContext) throws SandeshaException { 
+
+               if (options==null)
+                       throw new SandeshaException ("You must set the Options 
object before calling this method");
+               
+               EndpointReference epr = options.getTo();
+               if (epr==null)
+                       throw new SandeshaException ("You must set the toEPR 
before calling this method");
+               
+               String to = epr.getAddress();
+               String sequenceKey = (String) 
options.getProperty(SandeshaClientConstants.SEQUENCE_KEY);
+               String internalSequenceID = 
SandeshaUtil.getInternalSequenceID(to,sequenceKey);
+               SequenceReport sequenceReport = 
SandeshaClient.getOutgoingSequenceReport(internalSequenceID,configurationContext);
+               if (sequenceReport==null)
+                       throw new SandeshaException ("Cannot generate the 
sequence report for the given internalSequenceID");
+               if 
(sequenceReport.getSequenceStatus()!=SequenceReport.SEQUENCE_STATUS_ESTABLISHED)
+                       throw new SandeshaException ("Canot terminate the 
sequence since it is not active");
+               
+               StorageManager storageManager = 
SandeshaUtil.getSandeshaStorageManager(configurationContext);
+               SequencePropertyBeanMgr seqPropMgr = 
storageManager.getSequencePropretyBeanMgr();
+               SequencePropertyBean sequenceIDBean = 
seqPropMgr.retrieve(internalSequenceID,Sandesha2Constants.SequenceProperties.OUT_SEQUENCE_ID);
+               if (sequenceIDBean==null)
+                       throw new SandeshaException ("SequenceIdBean is not 
set");
+               
+               String sequenceID = sequenceIDBean.getValue();
+
+               if (sequenceID==null)
+                       throw new SandeshaException ("Cannot find the 
sequenceID");
+               
+               String rmSpecVersion = (String) 
options.getProperty(SandeshaClientConstants.RM_SPEC_VERSION);
+               if (rmSpecVersion==null) 
+                       rmSpecVersion = 
SpecSpecificConstants.getDefaultSpecVersion ();
+               
+               
options.setAction(SpecSpecificConstants.getTerminateSequenceAction(rmSpecVersion));
             
+               SOAPEnvelope dummyEnvelope = null;
+               SOAPFactory factory = null;
+               String soapNamespaceURI = options.getSoapVersionURI();
+               if 
(SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(soapNamespaceURI)) {
+                       factory = new SOAP12Factory ();
+                       dummyEnvelope = factory.getDefaultEnvelope();
+               }else  {
+                       factory = new SOAP11Factory ();
+                       dummyEnvelope = factory.getDefaultEnvelope();
+               }
+               
+               String rmNamespaceValue = 
SpecSpecificConstants.getRMNamespaceValue(rmSpecVersion);
+               TerminateSequence terminateSequence = new TerminateSequence 
(factory,rmNamespaceValue);
+               Identifier identifier = new Identifier 
(factory,rmNamespaceValue);
+               identifier.setIndentifer(sequenceID);
+               terminateSequence.setIdentifier(identifier);
+               terminateSequence.toSOAPEnvelope(dummyEnvelope);
+               
+               return dummyEnvelope;
+       }
+       
+       /**
+        * This blocks the system until the messages u have sent hv been 
completed.
+        * 
+        * @param serviceClient
+        */
+       public void waitUntilSequenceCompleted (ServiceClient serviceClient) 
throws SandeshaException {
+               waitUntilSequenceCompleted(serviceClient,-1);
+       }
+       
+       /**
+        * This blocks the system until the messages u have sent hv been 
completed or until the
+        * given time interval exceeds. (the time is taken in seconds)
+        * 
+        * @param serviceClient
+        * @param maxWaitingTime
+        */
+       public void waitUntilSequenceCompleted (ServiceClient serviceClient, 
long maxWaitingTime) throws SandeshaException{
+               
+               long startTime = System.currentTimeMillis();
+               
+               SequenceReport sequenceReport = 
getOutgoingSequenceReport(serviceClient);
+               if (sequenceReport==null) {
+                       throw new SandeshaException ("Cannnot find a sequence 
report for the given data");
+               }
+               
+               boolean done = false;
+               while (!done){
+                       sequenceReport = 
getOutgoingSequenceReport(serviceClient);
+                       int status = sequenceReport.getSequenceStatus();
+                       if (status==SequenceReport.SEQUENCE_STATUS_TERMINATED)
+                               done = true;
+                       if (status==SequenceReport.SEQUENCE_STATUS_TIMED_OUT)
+                               done = true;
+                       
+                       if (maxWaitingTime>=0) {
+                               long timeNow = System.currentTimeMillis();
+                               if (timeNow> (startTime+maxWaitingTime))
+                                       done = true;
+                       }
+               }
+               
+               
+       }
+       
+       //gives the out sequenceID if CS/CSR exchange is done. Otherwise a 
SandeshaException
+       public static String getSequenceID (ServiceClient serviceClient) throws 
SandeshaException {
+               
+               Options options = serviceClient.getOptions();
+               if (options==null)
+                       throw new SandeshaException("Options object is not 
set");
+               
+               EndpointReference toEPR = options.getTo();
+               if (toEPR==null)
+                       throw new SandeshaException ("To EPR is not set");
+               
+               String to = toEPR.getAddress();
+               String sequenceKey = (String) 
options.getProperty(SandeshaClientConstants.SEQUENCE_KEY);
+               
+               ServiceContext serviceContext = 
serviceClient.getServiceContext();
+               if (serviceContext==null)
+                       throw new SandeshaException ("Service context is not 
set");
+               
+               ConfigurationContext configurationContext = 
serviceContext.getConfigurationContext();
+               
+               String internalSequenceID = 
generateInternalSequenceIDForTheClientSide(to,sequenceKey);
+               
+               SequenceReport sequenceReport = 
SandeshaClient.getOutgoingSequenceReport(serviceClient);
+               if (sequenceReport==null)
+                       throw new SandeshaException ("Cannot get a sequence 
report from the given data");
+               
+               if 
(sequenceReport.getSequenceStatus()!=SequenceReport.SEQUENCE_STATUS_ESTABLISHED)
 {
+                       throw new SandeshaException ("Sequence is not in a 
active state. Either create sequence response has not being received or 
sequence has been terminated," +
+                                                                               
 " cannot get sequenceID");
+               }
+               
+               StorageManager storageManager = 
SandeshaUtil.getSandeshaStorageManager(configurationContext);
+               SequencePropertyBeanMgr seqPropMgr = 
storageManager.getSequencePropretyBeanMgr();
+               
+               SequencePropertyBean sequenceIDBean = 
seqPropMgr.retrieve(internalSequenceID,Sandesha2Constants.SequenceProperties.OUT_SEQUENCE_ID);
+               if (sequenceIDBean==null)
+                       throw new SandeshaException ("SequenceIdBean is not 
set");
+               
+               String sequenceID = sequenceIDBean.getValue();
+               return sequenceID;
+       }
+       
+       public static void sendAckRequest (ServiceClient serviceClient) throws 
SandeshaException {
+                               
+               Options options = serviceClient.getOptions();
+               if (options==null)
+                       throw new SandeshaException ("Options object is not 
set");
+               
+               ServiceContext serviceContext = 
serviceClient.getServiceContext();
+               if (serviceContext==null)
+                       throw new SandeshaException ("ServiceContext is null");
+               
+               ConfigurationContext configContext = 
serviceContext.getConfigurationContext();
+               
+               EndpointReference toEPR = options.getTo();
+               if (toEPR==null)
+                       throw new SandeshaException ("'To' address is not set 
is not set");
+
+               String to = toEPR.getAddress();
+
+               String sequenceKey = (String) 
options.getProperty(SandeshaClientConstants.SEQUENCE_KEY);
+               
+               String rmSpecVersion = (String) 
options.getProperty(SandeshaClientConstants.RM_SPEC_VERSION);
+               if (rmSpecVersion==null)
+                       rmSpecVersion = Sandesha2Constants.SPEC_VERSIONS.WSRM;
+               
+               if 
(Sandesha2Constants.SPEC_VERSIONS.WSRM.equals(rmSpecVersion)) {
+                       throw new SandeshaException ("Empty AckRequest messages 
can only be sent with the WSRX spec");
+               }
+               
+               String internalSequenceID = 
getInternalSequenceID(to,sequenceKey);
+               
+               SequenceReport sequenceReport = 
SandeshaClient.getOutgoingSequenceReport(internalSequenceID,configContext);
+               if (sequenceReport==null)
+                       throw new SandeshaException ("Cannot generate the 
sequence report for the given internalSequenceID");
+               if 
(sequenceReport.getSequenceStatus()!=SequenceReport.SEQUENCE_STATUS_ESTABLISHED)
+                       throw new SandeshaException ("Canot send the ackRequest 
message since it is not active");
+               
+               String outSequenceID = getSequenceID(serviceClient);
+               
+               String soapNamespaceURI = options.getSoapVersionURI();
+               SOAPFactory factory = null;
+               SOAPEnvelope dummyEnvelope = null;
+               if 
(SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(soapNamespaceURI)) {
+                       factory = new SOAP11Factory ();
+                       dummyEnvelope = factory.getDefaultEnvelope();
+               }else  {
+                       factory = new SOAP12Factory ();
+                       dummyEnvelope = factory.getDefaultEnvelope();
+               }
+               
+               String rmNamespaceValue = 
SpecSpecificConstants.getRMNamespaceValue(rmSpecVersion);
+               
+               AckRequested ackRequested = new AckRequested 
(factory,rmNamespaceValue);
+               Identifier identifier = new Identifier 
(factory,rmNamespaceValue);
+               identifier.setIndentifer(outSequenceID);
+               ackRequested.setIdentifier(identifier);
+               
+               ackRequested.toSOAPEnvelope(dummyEnvelope);
+               
+               OMElement ackRequestedHeaderBlock = 
dummyEnvelope.getHeader().getFirstChildWithName(new QName 
(rmNamespaceValue,Sandesha2Constants.WSRM_COMMON.ACK_REQUESTED));
+               
+               String oldAction = options.getAction();
+               
+               
options.setAction(SpecSpecificConstants.getAckRequestAction(rmSpecVersion));
+
+               serviceClient.addHeader(ackRequestedHeaderBlock);
+               
+               try {
+                       serviceClient.fireAndForget(null);
+               } catch (AxisFault e) {
+                       String message = "Could not send the ack request";
+                       throw new SandeshaException (message,e);
+               }       
+               
+           serviceClient.removeHeaders();
+               options.setAction(oldAction);           
+       }
+               
+       private static SOAPEnvelope configureCloseSequence (Options 
options,ConfigurationContext configurationContext) throws SandeshaException {
+
+               if (options==null)
+                       throw new SandeshaException ("You must set the Options 
object before calling this method");
+               
+               EndpointReference epr = options.getTo();
+               if (epr==null)
+                       throw new SandeshaException ("You must set the toEPR 
before calling this method");
+               
+               String to = epr.getAddress();
+               String sequenceKey = (String) 
options.getProperty(SandeshaClientConstants.SEQUENCE_KEY);
+               
+               String internalSequenceID = 
SandeshaUtil.getInternalSequenceID(to,sequenceKey);
+                               
+               SequenceReport sequenceReport = 
SandeshaClient.getOutgoingSequenceReport(internalSequenceID,configurationContext);
+               if (sequenceReport==null)
+                       throw new SandeshaException ("Cannot generate the 
sequence report for the given internalSequenceID");
+               if 
(sequenceReport.getSequenceStatus()!=SequenceReport.SEQUENCE_STATUS_ESTABLISHED)
+                       throw new SandeshaException ("Canot close the sequence 
since it is not active");
+               
+               StorageManager storageManager = 
SandeshaUtil.getSandeshaStorageManager(configurationContext);
+               SequencePropertyBeanMgr seqPropMgr = 
storageManager.getSequencePropretyBeanMgr();
+               SequencePropertyBean sequenceIDBean = 
seqPropMgr.retrieve(internalSequenceID,Sandesha2Constants.SequenceProperties.OUT_SEQUENCE_ID);
+               if (sequenceIDBean==null)
+                       throw new SandeshaException ("SequenceIdBean is not 
set");
+               
+               String sequenceID = sequenceIDBean.getValue();
+
+               if (sequenceID==null)
+                       throw new SandeshaException ("Cannot find the 
sequenceID");
+               
+               String rmSpecVersion = (String) 
options.getProperty(SandeshaClientConstants.RM_SPEC_VERSION);
+
+               if (rmSpecVersion==null) 
+                       rmSpecVersion = 
SpecSpecificConstants.getDefaultSpecVersion ();
+               
+               if (!SpecSpecificConstants.isSequenceClosingAllowed 
(rmSpecVersion))
+                       throw new SandeshaException ("This rm version does not 
allow sequence closing");        
+               
+               SOAPEnvelope dummyEnvelope = null;
+               SOAPFactory factory = null;
+               String soapNamespaceURI = options.getSoapVersionURI();
+               if 
(SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(soapNamespaceURI)) {
+                       factory = new SOAP12Factory ();
+                       dummyEnvelope = factory.getDefaultEnvelope();
+               }else  {
+                       factory = new SOAP11Factory ();
+                       dummyEnvelope = factory.getDefaultEnvelope();
+               }
+               
+               String rmNamespaceValue = 
SpecSpecificConstants.getRMNamespaceValue(rmSpecVersion);
+               
+               CloseSequence closeSequence = new CloseSequence 
(factory,rmNamespaceValue);
+               Identifier identifier = new Identifier 
(factory,rmNamespaceValue);
+               identifier.setIndentifer(sequenceID);
+               closeSequence.setIdentifier(identifier);
+               
+               closeSequence.toSOAPEnvelope(dummyEnvelope);
+               
+               return dummyEnvelope;
+       }
+       
+       private static SequenceReport getOutgoingSequenceReport (String 
internalSequenceID,ConfigurationContext configurationContext) throws 
SandeshaException {
+               
+               SequenceReport sequenceReport = new SequenceReport ();
+               
sequenceReport.setSequenceDirection(SequenceReport.SEQUENCE_DIRECTION_OUT);
+               
+               StorageManager storageManager = 
SandeshaUtil.getSandeshaStorageManager(configurationContext);
+               SequencePropertyBeanMgr seqPropMgr = 
storageManager.getSequencePropretyBeanMgr();
+               CreateSeqBeanMgr createSeqMgr = 
storageManager.getCreateSeqBeanMgr();
+               
+               Transaction reportTransaction = storageManager.getTransaction();
+               
+               CreateSeqBean createSeqFindBean = new CreateSeqBean ();
+               createSeqFindBean.setInternalSequenceID(internalSequenceID);
+               
+               CreateSeqBean createSeqBean = 
createSeqMgr.findUnique(createSeqFindBean);
+               
+               if (createSeqBean==null) {
+                       //check weather this is an terminated sequence.
+                       if 
(isSequenceTerminated(internalSequenceID,seqPropMgr)) {
+                               fillTerminatedOutgoingSequenceInfo 
(sequenceReport,internalSequenceID,seqPropMgr);
+                               
+                               return sequenceReport;
+                       }
+                       
+                       if (isSequenceTimedout(internalSequenceID,seqPropMgr)) {
+                               fillTimedoutOutgoingSequenceInfo 
(sequenceReport,internalSequenceID,seqPropMgr);
+                               
+                               return sequenceReport;
+                       }
+                       
+                       String message = "Unrecorder internalSequenceID";
+                       log.debug(message);
+                       return null;
+               }
+               
+               String outSequenceID = createSeqBean.getSequenceID();
+               if (outSequenceID==null) {
+                        
sequenceReport.setInternalSequenceID(internalSequenceID);
+                        
sequenceReport.setSequenceStatus(SequenceReport.SEQUENCE_STATUS_INITIAL);
+                        
sequenceReport.setSequenceDirection(SequenceReport.SEQUENCE_DIRECTION_OUT);
+                        
+                        return sequenceReport;
+               }
+               
+               
sequenceReport.setSequenceStatus(SequenceReport.SEQUENCE_STATUS_ESTABLISHED);
+               
+               
fillOutgoingSequenceInfo(sequenceReport,outSequenceID,seqPropMgr);
+               
+               reportTransaction.commit();
+               
+               return sequenceReport;  
+       }
+       
+       private static boolean isSequenceTerminated (String internalSequenceID, 
SequencePropertyBeanMgr seqPropMgr) throws SandeshaException { 
+               SequencePropertyBean internalSequenceFindBean = new 
SequencePropertyBean ();
+               internalSequenceFindBean.setValue(internalSequenceID);
+               
internalSequenceFindBean.setName(Sandesha2Constants.SequenceProperties.INTERNAL_SEQUENCE_ID);
+               
+               SequencePropertyBean internalSequenceBean = 
seqPropMgr.findUnique(internalSequenceFindBean);
+               if (internalSequenceBean==null) {
+                       String message = "Internal sequence Bean is not 
available for the given sequence";
+                       log.debug (message);
+                       
+                       return false;
+               }
+               
+               String outSequenceID = internalSequenceBean.getSequenceID();
+       
+               SequencePropertyBean sequenceTerminatedBean = 
seqPropMgr.retrieve(outSequenceID,Sandesha2Constants.SequenceProperties.SEQUENCE_TERMINATED);
+               if (sequenceTerminatedBean!=null && 
Sandesha2Constants.VALUE_TRUE.equals(sequenceTerminatedBean.getValue())) {
+                       return true;
+               }
+               
+               return false;
+       }
+       
+       private static boolean isSequenceTimedout (String internalSequenceID, 
SequencePropertyBeanMgr seqPropMgr) throws SandeshaException { 
+               SequencePropertyBean internalSequenceFindBean = new 
SequencePropertyBean ();
+               internalSequenceFindBean.setValue(internalSequenceID);
+               
internalSequenceFindBean.setName(Sandesha2Constants.SequenceProperties.INTERNAL_SEQUENCE_ID);
+               
+               SequencePropertyBean internalSequenceBean = 
seqPropMgr.findUnique(internalSequenceFindBean);
+               if (internalSequenceBean==null) {
+                       String message = "Internal sequence Bean is not 
available for the given sequence";
+                       log.debug (message);
+                       
+                       return false;
+               }
+               
+               String outSequenceID = internalSequenceBean.getSequenceID();
+       
+               SequencePropertyBean sequenceTerminatedBean = 
seqPropMgr.retrieve(outSequenceID,Sandesha2Constants.SequenceProperties.SEQUENCE_TIMED_OUT);
+               if (sequenceTerminatedBean!=null && 
Sandesha2Constants.VALUE_TRUE.equals(sequenceTerminatedBean.getValue())) {
+                       return true;
+               }
+               
+               return false;
+       }
+       
+       private static void fillTerminatedOutgoingSequenceInfo (SequenceReport 
report,String internalSequenceID,SequencePropertyBeanMgr seqPropMgr) throws 
SandeshaException  { 
+               SequencePropertyBean internalSequenceFindBean = new 
SequencePropertyBean ();
+               internalSequenceFindBean.setValue(internalSequenceID);
+               
internalSequenceFindBean.setName(Sandesha2Constants.SequenceProperties.INTERNAL_SEQUENCE_ID);
+               
+               SequencePropertyBean internalSequenceBean = 
seqPropMgr.findUnique(internalSequenceFindBean);
+               if (internalSequenceBean==null) {
+                       String message = "Not a valid terminated sequence. 
Internal sequence Bean is not available for the given sequence";
+                       log.debug (message);
+                       
+                       throw new SandeshaException (message);
+               }
+               
+               
report.setSequenceStatus(SequenceReport.SEQUENCE_STATUS_TERMINATED);
+               
+               String outSequenceID = internalSequenceBean.getSequenceID();
+               fillOutgoingSequenceInfo(report,outSequenceID,seqPropMgr);
+       }
+       
+       private static void fillTimedoutOutgoingSequenceInfo (SequenceReport 
report,String internalSequenceID, SequencePropertyBeanMgr seqPropMgr) throws 
SandeshaException  { 
+               SequencePropertyBean internalSequenceFindBean = new 
SequencePropertyBean ();
+               internalSequenceFindBean.setValue(internalSequenceID);
+               
internalSequenceFindBean.setName(Sandesha2Constants.SequenceProperties.INTERNAL_SEQUENCE_ID);
+               
+               SequencePropertyBean internalSequenceBean = 
seqPropMgr.findUnique(internalSequenceFindBean);
+               if (internalSequenceBean==null) {
+                       String message = "Not a valid timedOut sequence. 
Internal sequence Bean is not available for the given sequence";
+                       log.debug (message);
+                       
+                       throw new SandeshaException (message);
+               }
+               
+               
report.setSequenceStatus(SequenceReport.SEQUENCE_STATUS_TIMED_OUT);
+               String outSequenceID = internalSequenceBean.getSequenceID();
+               fillOutgoingSequenceInfo(report,outSequenceID,seqPropMgr);
+       }
+       
+       private static void fillOutgoingSequenceInfo (SequenceReport 
report,String outSequenceID, SequencePropertyBeanMgr seqPropMgr) throws 
SandeshaException  { 
+               report.setSequenceID(outSequenceID);
+               
+               ArrayList completedMessageList =  
AcknowledgementManager.getClientCompletedMessagesList 
(outSequenceID,seqPropMgr);
+               
+               Iterator iter = completedMessageList.iterator();
+               while (iter.hasNext()) {
+                       Long lng = new Long (Long.parseLong((String) 
iter.next()));
+                       report.addCompletedMessage(lng);
+               }
+       }
+       
+       private static byte getServerSequenceStatus (String 
sequenceID,StorageManager storageManager) throws SandeshaException {
+               
+               SequencePropertyBeanMgr seqPropMgr = 
storageManager.getSequencePropretyBeanMgr();
+               
+               SequencePropertyBean terminatedBean = 
seqPropMgr.retrieve(sequenceID,Sandesha2Constants.SequenceProperties.SEQUENCE_TERMINATED);
+               if (terminatedBean!=null) {
+                       return SequenceReport.SEQUENCE_STATUS_TERMINATED;
+               }
+               
+               SequencePropertyBean timedOutBean = 
seqPropMgr.retrieve(sequenceID,Sandesha2Constants.SequenceProperties.SEQUENCE_TIMED_OUT);
+               if (timedOutBean!=null) {
+                       return SequenceReport.SEQUENCE_STATUS_TIMED_OUT;
+               }
+               
+               NextMsgBeanMgr nextMsgMgr = storageManager.getNextMsgBeanMgr();
+               NextMsgBean nextMsgBean = nextMsgMgr.retrieve(sequenceID);
+               
+               if (nextMsgBean!=null) {
+                       return SequenceReport.SEQUENCE_STATUS_ESTABLISHED;
+               }
+               
+               throw new SandeshaException ("Unrecorded sequenceID");
+       }
+       
+       private class DummyCallback extends Callback {
+
+               public void onComplete(AsyncResult result) {
+                       // TODO Auto-generated method stub
+                       System.out.println("Error: dummy callback was called");
+               }
+
+               public void onError(Exception e) {
+                       // TODO Auto-generated method stub
+                       System.out.println("Error: dummy callback received an 
error");
+                       
+               }
+               
+       }
+       
+       private static SequenceReport getIncomingSequenceReport (String 
sequenceID,ConfigurationContext configCtx) throws SandeshaException {
+               
+               StorageManager storageManager = 
SandeshaUtil.getSandeshaStorageManager(configCtx);
+               SequencePropertyBeanMgr seqPropMgr = 
storageManager.getSequencePropretyBeanMgr();
+               
+               SequenceReport sequenceReport = new SequenceReport ();
+
+               ArrayList completedMessageList =  
AcknowledgementManager.getServerCompletedMessagesList (sequenceID,seqPropMgr);
+
+               Iterator iter = completedMessageList.iterator();
+               while (iter.hasNext()) {;
+                       sequenceReport.addCompletedMessage((Long) iter.next());
+               }
+               
+               sequenceReport.setSequenceID(sequenceID);
+               sequenceReport.setInternalSequenceID(sequenceID);  //for the 
incoming side   internalSequenceID=sequenceID
+               
sequenceReport.setSequenceDirection(SequenceReport.SEQUENCE_DIRECTION_IN);
+
+               sequenceReport.setSequenceStatus(getServerSequenceStatus 
(sequenceID,storageManager));
+       
+               return sequenceReport;
+       }
+       
+       private static String getInternalSequenceID (String to, String 
sequenceKey) {
+               return SandeshaUtil.getInternalSequenceID(to,sequenceKey);
+       }
+       
+       
+       private static String generateInternalSequenceIDForTheClientSide 
(String toEPR,String sequenceKey) {
+               return SandeshaUtil.getInternalSequenceID(toEPR,sequenceKey);
+       }
+       
+}

Added: 
webservices/sandesha/trunk/src/org/apache/sandesha2/client/SandeshaClientConstants.java
URL: 
http://svn.apache.org/viewcvs/webservices/sandesha/trunk/src/org/apache/sandesha2/client/SandeshaClientConstants.java?rev=392569&view=auto
==============================================================================
--- 
webservices/sandesha/trunk/src/org/apache/sandesha2/client/SandeshaClientConstants.java
 (added)
+++ 
webservices/sandesha/trunk/src/org/apache/sandesha2/client/SandeshaClientConstants.java
 Sat Apr  8 11:21:08 2006
@@ -0,0 +1,29 @@
+/*
+ * 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.client;
+
+public class SandeshaClientConstants {
+       public static String AcksTo = "Sandesha2AcksTo";
+       public static String LAST_MESSAGE = "Sandesha2LastMessage";
+       public static String OFFERED_SEQUENCE_ID = "Sandesha2OfferedSequenceId";
+       public static String SANDESHA_DEBUG_MODE = "Sandesha2DebugMode";
+       public static String SEQUENCE_KEY = "Sandesha2SequenceKey";
+       public static String MESSAGE_NUMBER = "Sandesha2MessageNumber";
+       public static String RM_SPEC_VERSION = "Sandesha2RMSpecVersion";
+       public static String DUMMY_MESSAGE = "Sandesha2DummyMessage"; //If this 
property is set, even though this message will invoke the RM handlers, this 
will not be sent as an actual application message
+       public static String RM_FAULT_CALLBACK = "Sandesha2RMFaultCallback";
+}

Added: 
webservices/sandesha/trunk/src/org/apache/sandesha2/client/SandeshaFaultCallback.java
URL: 
http://svn.apache.org/viewcvs/webservices/sandesha/trunk/src/org/apache/sandesha2/client/SandeshaFaultCallback.java?rev=392569&view=auto
==============================================================================
--- 
webservices/sandesha/trunk/src/org/apache/sandesha2/client/SandeshaFaultCallback.java
 (added)
+++ 
webservices/sandesha/trunk/src/org/apache/sandesha2/client/SandeshaFaultCallback.java
 Sat Apr  8 11:21:08 2006
@@ -0,0 +1,26 @@
+/*
+ * 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.
+ *  
+ */
+
+package org.apache.sandesha2.client;
+
+import org.apache.axis2.AxisFault;
+
+public abstract class SandeshaFaultCallback {
+
+       public abstract void onError(AxisFault fault);
+
+}

Added: 
webservices/sandesha/trunk/src/org/apache/sandesha2/client/SandeshaReport.java
URL: 
http://svn.apache.org/viewcvs/webservices/sandesha/trunk/src/org/apache/sandesha2/client/SandeshaReport.java?rev=392569&view=auto
==============================================================================
--- 
webservices/sandesha/trunk/src/org/apache/sandesha2/client/SandeshaReport.java 
(added)
+++ 
webservices/sandesha/trunk/src/org/apache/sandesha2/client/SandeshaReport.java 
Sat Apr  8 11:21:08 2006
@@ -0,0 +1,91 @@
+/*
+ * 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.client;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+
+
+/**
+ * @author Chamikara Jayalath <[EMAIL PROTECTED]>
+ */
+public class SandeshaReport {
+       
+       private ArrayList incomingSequenceList = null;
+       private ArrayList outgoingSequenceList = null;
+       private HashMap sequenceStatusMap = null;
+       private HashMap noOfCompletedMessagesMap = null;
+       private HashMap outgoingInternalSequenceIDMap = null;
+       
+       public SandeshaReport () {
+               incomingSequenceList = new ArrayList ();
+               outgoingSequenceList = new ArrayList ();
+               sequenceStatusMap = new HashMap ();
+               noOfCompletedMessagesMap = new HashMap ();
+               outgoingInternalSequenceIDMap = new HashMap ();
+       }
+
+       public long getCompletedMessagesCount(String sequenceID) {
+               Long lng = (Long) noOfCompletedMessagesMap.get(sequenceID);
+               if (lng==null)
+                       return -1;
+               
+               return lng.longValue();
+       }
+
+       public ArrayList getIncomingSequenceList() {
+               return incomingSequenceList;
+       }
+
+       public ArrayList getOutgoingSequenceList() {
+               return outgoingSequenceList;
+       }
+
+       public byte getSequenceStatusMap(String sequenceID) {
+               Byte status = (Byte) sequenceStatusMap.get(sequenceID);
+               if (status==null)
+                       return SequenceReport.SEQUENCE_STATUS_UNKNOWN;
+               
+               return status.byteValue();
+       }
+
+       public void addToIncomingSequenceList (String incomingSequenceID) {
+               incomingSequenceList.add(incomingSequenceID);
+       }
+       
+       public void addToOutgoingSequenceList (String outSequenceID) {
+               outgoingSequenceList.add(outSequenceID);
+       }
+       
+       public void addToNoOfCompletedMessagesMap (String id, long noOfMsgs) {
+               noOfCompletedMessagesMap.put(id, new Long (noOfMsgs));
+       }
+       
+       public void addToSequenceStatusMap (String id, byte status) {
+               sequenceStatusMap.put(id, new Byte (status));
+       }
+       
+       public String getInternalSequenceIdOfOutSequence (String outSequenceID) 
{
+               return (String) 
outgoingInternalSequenceIDMap.get(outSequenceID);
+       }
+       
+       public void addToOutgoingInternalSequenceMap (String outSequenceID, 
String internalSequenceID) {
+               
outgoingInternalSequenceIDMap.put(outSequenceID,internalSequenceID);
+       }
+       
+}



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

Reply via email to