Hi ;

My mistake I didnt see the JIRA , but I am still in -1 state until we
come to a conclusion.

Specially when we change API and their implementation we need to discuss
that in the mailing list and then implement .

Thnaks
Deepal

Deepal Jayasinghe wrote:

>Hi Bill;
>
>I am -1 on this since no one discuss about this change before in the
>mailing list  and I didnt find any JIRA related to this. So I think we
>need to revert this changes until we come to an conclusion.
>
>Thanks
>Deepal
>
>[EMAIL PROTECTED] wrote:
>
>  
>
>>Author: nagy
>>Date: Wed Jan 24 10:38:56 2007
>>New Revision: 499521
>>
>>URL: http://svn.apache.org/viewvc?view=rev&rev=499521
>>Log:
>>AXIS2-2020
>>Contributor: Matt Lovett
>>Fix to allow clients/other layers that use the OperationClient directly (as 
>>opposed to going through the ServiceClient) to function correctly with sync 
>>2-way messaging and RM enabled.
>>
>>Modified:
>>   
>> webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/client/ServiceClient.java
>>   
>> webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/OutInAxisOperation.java
>>
>>Modified: 
>>webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/client/ServiceClient.java
>>URL: 
>>http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/client/ServiceClient.java?view=diff&rev=499521&r1=499520&r2=499521
>>==============================================================================
>>--- 
>>webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/client/ServiceClient.java
>> (original)
>>+++ 
>>webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/client/ServiceClient.java
>> Wed Jan 24 10:38:56 2007
>>@@ -20,17 +20,13 @@
>>import org.apache.axiom.om.OMElement;
>>import org.apache.axiom.soap.*;
>>import org.apache.axis2.AxisFault;
>>-import org.apache.axis2.Constants;
>>import org.apache.axis2.addressing.EndpointReference;
>>-import org.apache.axis2.client.async.AsyncResult;
>>import org.apache.axis2.client.async.Callback;
>>import org.apache.axis2.context.*;
>>import org.apache.axis2.description.*;
>>import org.apache.axis2.engine.AxisConfiguration;
>>import org.apache.axis2.engine.ListenerManager;
>>-import org.apache.axis2.engine.MessageReceiver;
>>import org.apache.axis2.i18n.Messages;
>>-import org.apache.axis2.util.CallbackReceiver;
>>import org.apache.axis2.wsdl.WSDLConstants;
>>
>>import javax.wsdl.Definition;
>>@@ -396,65 +392,11 @@
>>     * @see #createClient(QName)
>>     */
>>    public void sendRobust(QName operation, OMElement elem) throws AxisFault {
>>-        if (options.isUseSeparateListener()) {
>>-
>>-            // This mean doing a Fault may come through a different channel .
>>-            // If the
>>-            // transport is two way transport (e.g. http) Only one channel is
>>-            // used (e.g. in http cases
>>-            // 202 OK is sent to say no response available). Axis2 get 
>>blocked
>>-            // return when the response is available.
>>-            SyncCallBack callback = new SyncCallBack();
>>-
>>-            // this method call two channel non blocking method to do the 
>>work
>>-            // and wait on the callback
>>-            sendReceiveNonBlocking(operation, elem, callback);
>>-
>>-            long timeout = options.getTimeOutInMilliSeconds();
>>-            long waitTime = timeout;
>>-            long startTime = System.currentTimeMillis();
>>-
>>-            synchronized (callback) {
>>-                while (! callback.isComplete() && waitTime >= 0) {
>>-                    try {
>>-                        callback.wait(timeout);
>>-                    } catch (InterruptedException e) {
>>-                        // We were interrupted for some reason, keep waiting
>>-                        // or throw new AxisFault( "Callback was interrupted 
>>by someone?" );
>>-                    }
>>-                    // The wait finished, compute remaining time
>>-                    // - wait can end prematurely, see Object.wait( int 
>>timeout )
>>-                    waitTime = timeout - (System.currentTimeMillis() - 
>>startTime);
>>-                }
>>-
>>-            }
>>-            SOAPEnvelope envelope = callback.envelope;
>>-            // process the result of the invocation
>>-            if (envelope != null) {
>>-                // building soap envelope
>>-                envelope.build();
>>-                // closing transport
>>-                if (envelope.getBody().hasFault()) {
>>-                    SOAPFault soapFault = envelope.getBody().getFault();
>>-                    throw new AxisFault(soapFault.getCode(), 
>>soapFault.getReason(),
>>-                            soapFault.getNode(), soapFault.getRole(), 
>>soapFault.getDetail());
>>-                }
>>-            } else {
>>-                if (callback.error instanceof AxisFault) {
>>-                    throw (AxisFault) callback.error;
>>-                } else if (callback.error != null) {
>>-                    throw new AxisFault(callback.error);
>>-                } else if (! callback.isComplete()) {
>>-                    //no exception has occurred
>>-                }
>>-            }
>>-        } else {
>>-            MessageContext mc = new MessageContext();
>>-            fillSOAPEnvelope(mc, elem);
>>-            OperationClient mepClient = createClient(operation);
>>-            mepClient.addMessageContext(mc);
>>-            mepClient.execute(true);
>>-        }
>>+        MessageContext mc = new MessageContext();
>>+        fillSOAPEnvelope(mc, elem);
>>+        OperationClient mepClient = createClient(operation);
>>+        mepClient.addMessageContext(mc);
>>+        mepClient.execute(true);
>>    }
>>
>>    /**
>>@@ -524,76 +466,14 @@
>>     */
>>    public OMElement sendReceive(QName operationQName, OMElement xmlPayload)
>>            throws AxisFault {
>>-        /**
>>-         * If a module has set the USE_ASYNC_OPERATIONS option then we 
>>override the behaviour
>>-         * for sync calls. However we leave real async calls alone.
>>-         */
>>-        boolean useAsync = false;
>>-        if (!options.isUseSeparateListener()) {
>>-            Boolean useAsyncOption = (Boolean) 
>>configContext.getProperty(Constants.Configuration.USE_ASYNC_OPERATIONS);
>>-            if (useAsyncOption != null) useAsync = 
>>useAsyncOption.booleanValue();
>>-        }
>>-
>>-        if (useAsync || options.isUseSeparateListener()) {
>>-
>>-            // Here we are trying to do a request-response invocation using 
>>two different channels for the request
>>-            // and the response.
>>-            // For example, if the IN and OUT transports are HTTP, then two 
>>different HTTP channels will be used. The first
>>-            // channel will be used to send the request, which the server 
>>respond sending HTTP 200, if accepted and uses
>>-            // a completely different channel to send the response. This 
>>flag, informs the Axis2 client engine to
>>-            // keep listeners ready to receive the response.
>>-
>>-            // even if the client is blocking we use a Callback, internally, 
>>to relate the response back to the client.
>>-            SyncCallBack callback = new SyncCallBack();
>>-
>>-            // this method call two channel non blocking method to do the 
>>work
>>-            // and wait on the callback
>>-            sendReceiveNonBlocking(operationQName, xmlPayload, callback);
>>-
>>-            long timeout = options.getTimeOutInMilliSeconds();
>>-            long waitTime = timeout;
>>-            long startTime = System.currentTimeMillis();
>>-
>>-            synchronized (callback) {
>>-                while (! callback.isComplete() && waitTime >= 0) {
>>-                    try {
>>-                        callback.wait(timeout);
>>-                    } catch (InterruptedException e) {
>>-                        // We were interrupted for some reason, keep waiting
>>-                        // or throw new AxisFault( "Callback was interrupted 
>>by someone?" );
>>-                    }
>>-                    // The wait finished, compute remaining time
>>-                    // - wait can end prematurely, see Object.wait( int 
>>timeout )
>>-                    waitTime = timeout - (System.currentTimeMillis() - 
>>startTime);
>>-                }
>>-
>>-            }
>>-            // process the result of the invocation
>>-            if (callback.envelope != null) {
>>-                // transport was already returned by the call back receiver
>>-                //Building of the Envelope should happen at the setComplete()
>>-                // or onComplete() methods of the Callback class
>>-                return callback.envelope.getBody().getFirstElement();
>>-            } else {
>>-                if (callback.error instanceof AxisFault) {
>>-                    throw (AxisFault) callback.error;
>>-                } else if (callback.error != null) {
>>-                    throw new AxisFault(callback.error);
>>-                } else if (! callback.isComplete()) {
>>-                    throw new 
>>AxisFault(Messages.getMessage("responseTimeOut"));
>>-                } else
>>-                    throw new 
>>AxisFault(Messages.getMessage("callBackCompletedWithError"));
>>-            }
>>-        } else {
>>-            MessageContext messageContext = new MessageContext();
>>-            fillSOAPEnvelope(messageContext, xmlPayload);
>>-            OperationClient operationClient = createClient(operationQName);
>>-            operationClient.addMessageContext(messageContext);
>>-            operationClient.execute(true);
>>-            MessageContext response = operationClient
>>-                    .getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE);
>>-            return response.getEnvelope().getBody().getFirstElement();
>>-        }
>>+        MessageContext messageContext = new MessageContext();
>>+        fillSOAPEnvelope(messageContext, xmlPayload);
>>+        OperationClient operationClient = createClient(operationQName);
>>+        operationClient.addMessageContext(messageContext);
>>+        operationClient.execute(true);
>>+        MessageContext response = operationClient
>>+                .getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE);
>>+        return response.getEnvelope().getBody().getFirstElement();
>>    }
>>
>>    /**
>>@@ -635,24 +515,6 @@
>>        // progamming model is non blocking
>>        mepClient.setCallback(callback);
>>        mepClient.addMessageContext(mc);
>>-
>>-        /**
>>-         * If a module has set the USE_ASYNC_OPERATIONS option then we 
>>override the behaviour
>>-         * for sync calls. However we leave real async calls alone.
>>-         */
>>-        boolean useAsync = false;
>>-        if (!options.isUseSeparateListener()) {
>>-            Boolean useAsyncOption = (Boolean) 
>>configContext.getProperty(Constants.Configuration.USE_ASYNC_OPERATIONS);
>>-            if (useAsyncOption != null) useAsync = 
>>useAsyncOption.booleanValue();
>>-        }
>>-
>>-        if (useAsync || options.isUseSeparateListener()) {
>>-            MessageReceiver messageReceiver = 
>>axisService.getOperation(operation).getMessageReceiver();
>>-            if (messageReceiver == null || !(messageReceiver instanceof 
>>CallbackReceiver)) {
>>-                CallbackReceiver callbackReceiver = new CallbackReceiver();
>>-                
>>axisService.getOperation(operation).setMessageReceiver(callbackReceiver);
>>-            }
>>-        }
>>        mepClient.execute(false);
>>    }
>>
>>@@ -785,42 +647,6 @@
>>        serviceContext.setCachingOperationContext(cachingOpContext);
>>    }
>>
>>-
>>-    /**
>>-     * This class acts as a callback that allows users to wait on the result.
>>-     */
>>-    private class SyncCallBack extends Callback {
>>-        private SOAPEnvelope envelope;
>>-
>>-        private MessageContext msgctx;
>>-
>>-        private Exception error;
>>-
>>-        public void onComplete(AsyncResult result) {
>>-            this.envelope = result.getResponseEnvelope();
>>-            // Transport input stream gets closed after calling setComplete
>>-            // method. Have to build the whole envelope including the
>>-            // attachments at this stage. Data might get lost if the input
>>-            // stream gets closed before building the whole envelope.
>>-            this.envelope.buildWithAttachments();
>>-            this.msgctx = result.getResponseMessageContext();
>>-        }
>>-
>>-        public void setComplete(boolean complete) {
>>-            super.setComplete(complete);
>>-            synchronized (this) {
>>-                notify();
>>-            }
>>-        }
>>-
>>-        public void onError(Exception e) {
>>-            error = e;
>>-        }
>>-
>>-        public MessageContext getMsgctx() {
>>-            return msgctx;
>>-        }
>>-    }
>>
>>    /**
>>     * Get the service context.
>>
>>Modified: 
>>webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/OutInAxisOperation.java
>>URL: 
>>http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/OutInAxisOperation.java?view=diff&rev=499521&r1=499520&r2=499521
>>==============================================================================
>>--- 
>>webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/OutInAxisOperation.java
>> (original)
>>+++ 
>>webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/OutInAxisOperation.java
>> Wed Jan 24 10:38:56 2007
>>@@ -35,6 +35,8 @@
>>import org.apache.axis2.util.CallbackReceiver;
>>import org.apache.axiom.om.util.UUIDGenerator;
>>import org.apache.axis2.wsdl.WSDLConstants;
>>+import org.apache.commons.logging.Log;
>>+import org.apache.commons.logging.LogFactory;
>>
>>import javax.xml.namespace.QName;
>>import java.util.HashMap;
>>@@ -95,6 +97,8 @@
>> */
>>class OutInAxisOperationClient extends OperationClient {
>>
>>+    private static Log log = 
>>LogFactory.getLog(OutInAxisOperationClient.class);
>>+     
>>    OutInAxisOperationClient(OutInAxisOperation axisOp, ServiceContext sc,
>>                             Options options) {
>>        super(axisOp, sc, options);
>>@@ -149,6 +153,7 @@
>>     * @throws AxisFault if something goes wrong during the execution of the 
>> MEP.
>>     */
>>    public void execute(boolean block) throws AxisFault {
>>+     if(log.isDebugEnabled()) log.debug("Entry: 
>>OutInAxisOperationClient::execute, " + block);
>>        if (completed) {
>>            throw new AxisFault(Messages.getMessage("mepiscomplted"));
>>        }
>>@@ -181,9 +186,29 @@
>>        }
>>        
>>        if (useAsync || options.isUseSeparateListener()) {
>>-            CallbackReceiver callbackReceiver = (CallbackReceiver) axisOp
>>-                    .getMessageReceiver();
>>-            callbackReceiver.addCallback(mc.getMessageID(), callback);
>>+             if(log.isDebugEnabled())
>>+                     log.debug("useAsync=" + useAsync + ", 
>>seperateListener=" + options.isUseSeparateListener());
>>+             /**
>>+              * We are following the async path. If the user hasn't set a 
>>callback object then we must
>>+              * block until the whole MEP is complete, as they have no other 
>>way to get their reply message.
>>+              */
>>+             CallbackReceiver callbackReceiver = null;
>>+             if(axisOp.getMessageReceiver() != null && 
>>axisOp.getMessageReceiver() instanceof CallbackReceiver) {
>>+                     callbackReceiver = (CallbackReceiver) 
>>axisOp.getMessageReceiver();
>>+             } else {
>>+             if(log.isDebugEnabled()) log.debug("Creating new callback 
>>receiver");
>>+                     callbackReceiver = new CallbackReceiver();
>>+                     axisOp.setMessageReceiver(callbackReceiver);
>>+             }
>>+             
>>+             SyncCallBack internalCallback = null;
>>+             if(callback != null) {
>>+                callbackReceiver.addCallback(mc.getMessageID(), callback);
>>+             } else {
>>+             if(log.isDebugEnabled()) log.debug("Creating internal 
>>callback");
>>+                     internalCallback = new SyncCallBack();
>>+                     callbackReceiver.addCallback(mc.getMessageID(), 
>>internalCallback);
>>+             }
>>            
>>            /**
>>             * If USE_CUSTOM_LISTENER is set to 'true' the replyTo value will 
>> not be replaced and Axis2 will not
>>@@ -205,14 +230,45 @@
>>                    
>> mc.getReplyTo().setAddress(replyToFromTransport.getAddress());
>>                }
>>            }
>>-
>>-
>>            
>>            //if we don't do this , this guy will wait till it gets HTTP 202 
>> in the HTTP case
>>            mc.setProperty(MessageContext.TRANSPORT_NON_BLOCKING, 
>> Boolean.TRUE);
>>            AxisEngine engine = new AxisEngine(cc);
>>            
>> mc.getConfigurationContext().registerOperationContext(mc.getMessageID(), oc);
>>            engine.send(mc);
>>+            
>>+            if(internalCallback != null) {
>>+                 long timeout = options.getTimeOutInMilliSeconds();
>>+                 long waitTime = timeout;
>>+                 long startTime = System.currentTimeMillis();
>>+     
>>+                 synchronized (internalCallback) {
>>+                     while (! internalCallback.isComplete() && waitTime >= 
>>0) {
>>+                         try {
>>+                             internalCallback.wait(timeout);
>>+                         } catch (InterruptedException e) {
>>+                             // We were interrupted for some reason, keep 
>>waiting
>>+                             // or throw new AxisFault( "Callback was 
>>interrupted by someone?" );
>>+                         }
>>+                         // The wait finished, compute remaining time
>>+                         // - wait can end prematurely, see Object.wait( int 
>>timeout )
>>+                         waitTime = timeout - (System.currentTimeMillis() - 
>>startTime);
>>+                     }
>>+                 }
>>+                             // process the result of the invocation
>>+                             if (internalCallback.envelope != null) {
>>+                                     // The call ended normally, so there is 
>>nothing to do
>>+                             } else {
>>+                                     if (internalCallback.error instanceof 
>>AxisFault) {
>>+                                             throw (AxisFault) 
>>internalCallback.error;
>>+                                     } else if (internalCallback.error != 
>>null) {
>>+                                             throw new 
>>AxisFault(internalCallback.error);
>>+                                     } else if (! 
>>internalCallback.isComplete()) {
>>+                                             throw new 
>>AxisFault(Messages.getMessage("responseTimeOut"));
>>+                                     } else
>>+                                             throw new 
>>AxisFault(Messages.getMessage("callBackCompletedWithError"));
>>+                             }
>>+            }
>>        } else {
>>            if (block) {
>>                // Send the SOAP Message and receive a response
>>@@ -344,4 +400,41 @@
>>                      }
>>        }
>>    }
>>+    
>>+    /**
>>+     * This class acts as a callback that allows users to wait on the result.
>>+     */
>>+    private class SyncCallBack extends Callback {
>>+
>>+             private SOAPEnvelope envelope;
>>+
>>+             private Exception error;
>>+
>>+             public void onComplete(AsyncResult result) {
>>+             if(log.isDebugEnabled()) log.debug("Entry: 
>>OutInAxisOperationClient$SyncCallBack::onComplete");
>>+            // Transport input stream gets closed after calling setComplete
>>+            // method. Have to build the whole envelope including the
>>+            // attachments at this stage. Data might get lost if the input
>>+            // stream gets closed before building the whole envelope.
>>+            this.envelope = result.getResponseEnvelope();
>>+            this.envelope.buildWithAttachments();
>>+             if(log.isDebugEnabled()) log.debug("Exit: 
>>OutInAxisOperationClient$SyncCallBack::onComplete");
>>+        }
>>+
>>+        public void setComplete(boolean complete) {
>>+             if(log.isDebugEnabled()) log.debug("Entry: 
>>OutInAxisOperationClient$SyncCallBack::setComplete, " + complete);
>>+            super.setComplete(complete);
>>+            synchronized (this) {
>>+                notify();
>>+            }
>>+             if(log.isDebugEnabled()) log.debug("Exit: 
>>OutInAxisOperationClient$SyncCallBack::setComplete, " + complete);
>>+        }
>>+
>>+        public void onError(Exception e) {
>>+             if(log.isDebugEnabled()) log.debug("Entry: 
>>OutInAxisOperationClient$SyncCallBack::onError, " + e);
>>+            error = e;
>>+             if(log.isDebugEnabled()) log.debug("Exit: 
>>OutInAxisOperationClient$SyncCallBack::onError");
>>+        }
>>+    }
>>+
>>}
>>
>>
>>
>>---------------------------------------------------------------------
>>To unsubscribe, e-mail: [EMAIL PROTECTED]
>>For additional commands, e-mail: [EMAIL PROTECTED]
>>
>>
>>
>> 
>>
>>    
>>
>
>  
>

-- 
Thanks,
Deepal
................................................................
"The highest tower is built one brick at a time"



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

Reply via email to