Author: pzf
Date: Fri Nov 17 06:49:36 2006
New Revision: 476161

URL: http://svn.apache.org/viewvc?view=rev&rev=476161
Log:
fix for fire and forget

Modified:
    
incubator/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/Axis2Sender.java
    
incubator/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/DynamicAxisOperation.java

Modified: 
incubator/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/Axis2Sender.java
URL: 
http://svn.apache.org/viewvc/incubator/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/Axis2Sender.java?view=diff&rev=476161&r1=476160&r2=476161
==============================================================================
--- 
incubator/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/Axis2Sender.java
 (original)
+++ 
incubator/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/Axis2Sender.java
 Fri Nov 17 06:49:36 2006
@@ -71,7 +71,8 @@
                     // The Axis2 Message context of the Synapse MC
                     synapseInMessageContext);
 
-            if (axisOutMsgContext != null) {
+          
+            if (axisOutMsgContext != null && 
axisOutMsgContext.getEnvelope()!=null) { // if there is no response env will be 
null
                 //set the response Envelop as a property in Original axisMsgCtx
                 synapseInMessageContext.setProperty(
                     org.apache.synapse.Constants.RESPONSE_SOAP_ENVELOPE,

Modified: 
incubator/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/DynamicAxisOperation.java
URL: 
http://svn.apache.org/viewvc/incubator/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/DynamicAxisOperation.java?view=diff&rev=476161&r1=476160&r2=476161
==============================================================================
--- 
incubator/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/DynamicAxisOperation.java
 (original)
+++ 
incubator/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/DynamicAxisOperation.java
 Fri Nov 17 06:49:36 2006
@@ -19,7 +19,6 @@
 
 package org.apache.synapse.core.axis2;
 
-
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.Constants;
 import org.apache.axis2.transport.TransportUtils;
@@ -54,379 +53,405 @@
  */
 public class DynamicAxisOperation extends OutInAxisOperation {
 
-    public DynamicAxisOperation() {
-        super();
-    }
-
-    public DynamicAxisOperation(QName name) {
-        super(name);
-    }
-
-    public OperationClient createClient(ServiceContext sc, Options options) {
-        return new DynamicOperationClient(this, sc, options);
-    }
-
-    class DynamicOperationClient implements OperationClient {
-
-        private AxisOperation axisOp;
-        protected ServiceContext sc;
-        protected Options options;
-        protected OperationContext oc;
-        protected Callback callback;
-
-        /*
-         * indicates whether the MEP execution has completed (and hence ready 
for
-         * resetting)
-         */
-        boolean completed;
-
-        DynamicOperationClient(OutInAxisOperation axisOp, ServiceContext sc,
-                                 Options options) {
-            this.axisOp = axisOp;
-            this.sc = sc;
-            this.options = options;
-            this.completed = false;
-            this.oc = new OperationContext(axisOp);
-            this.oc.setParent(this.sc);
-        }
-
-        /**
-         * Sets the options that should be used for this particular client. 
This
-         * resets the entire set of options to use the new options - so you'd 
lose
-         * any option cascading that may have been set up.
-         *
-         * @param options the options
-         */
-        public void setOptions(Options options) {
-            this.options = options;
-        }
-
-        /**
-         * Returns the options used by this client. If you want to set a single
-         * option, then the right way is to call getOptions() and set specific
-         * options.
-         *
-         * @return Returns the options, which will never be null.
-         */
-        public Options getOptions() {
-            return options;
-        }
-
-        /**
-         * Adds message context to operation context , so that it will handle 
the
-         * logic correctly if the OperationContext is null then new one will be
-         * created , and Operation Context will become null when some one 
calls reset().
-         *
-         * @param mc
-         * @throws AxisFault
-         */
-        public void addMessageContext(MessageContext mc) throws AxisFault {
-            mc.setServiceContext(sc);
-            if (mc.getMessageID() == null) {
-                setMessageID(mc);
-            }
-            axisOp.registerOperationContext(mc, oc);
-        }
-
-        /**
-         * Returns the message context for a given message label.
-         *
-         * @param messageLabel :
-         *                     label of the message and that can be either 
"Out" or "In" and
-         *                     nothing else
-         * @return Returns MessageContext.
-         * @throws AxisFault
-         */
-        public MessageContext getMessageContext(String messageLabel)
-                throws AxisFault {
-            return oc.getMessageContext(messageLabel);
-        }
-
-        public void setCallback(Callback callback) {
-            this.callback = callback;
-        }
-
-        /**
-         * Create a message ID for the given message context if needed. If 
user gives an option with
-         * MessageID then just copy that into MessageContext , and with that 
there can be mutiple
-         * message with same MessageID unless user call setOption for each 
invocation.
-         * <p/>
-         * If user want to give message ID then the better way is to set the 
message ID in the option and
-         * call setOption for each invocation then the right thing will happen.
-         * <p/>
-         * If user does not give a message ID then the new one will be created 
and set that into Message
-         * Context.
-         *
-         * @param mc the message context whose id is to be set
-         */
-        private void setMessageID(MessageContext mc) {
-            // now its the time to put the parameters set by the user in to the
-            // correct places and to the
-            // if there is no message id still, set a new one.
-            String messageId = options.getMessageId();
-            if (messageId == null || "".equals(messageId)) {
-                messageId = UUIDGenerator.getUUID();
-            }
-            mc.setMessageID(messageId);
-        }
-
-
-        /**
-         * Executes the MEP. What this does depends on the specific MEP 
client. The
-         * basic idea is to have the MEP client execute and do something with 
the
-         * messages that have been added to it so far. For example, if its an 
Out-In
-         * MEP, then if the Out message has been set, then executing the 
client asks
-         * it to send the message and get the In message, possibly using a 
different
-         * thread.
-         *
-         * @param block Indicates whether execution should block or return 
ASAP. What
-         *              block means is of course a function of the specific MEP
-         *              client. IGNORED BY THIS MEP CLIENT.
-         * @throws AxisFault if something goes wrong during the execution of 
the MEP.
-         */
-        public void execute(boolean block) throws AxisFault {
-            if (completed) {
-                throw new AxisFault(Messages.getMessage("mepiscomplted"));
-            }
-            ConfigurationContext cc = sc.getConfigurationContext();
-
-            // copy interesting info from options to message context.
-            MessageContext mc = oc
-                    .getMessageContext(WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
-            if (mc == null) {
-                throw new AxisFault(Messages.getMessage("outmsgctxnull"));
-            }
-
-            mc.setOptions(options);
-
-            // do Target Resolution
-            
cc.getAxisConfiguration().getTargetResolverChain().resolveTarget(mc);
-
-            // if the transport to use for sending is not specified, try to 
find it
-            // from the URL
-            TransportOutDescription transportOut = options.getTransportOut();
-            if (transportOut == null) {
-                EndpointReference toEPR = (options.getTo() != null) ? options
-                        .getTo() : mc.getTo();
-                transportOut = ClientUtils.inferOutTransport(cc
-                        .getAxisConfiguration(), toEPR, mc);
-            }
-            mc.setTransportOut(transportOut);
-
-
-            if (options.getTransportIn() == null && mc.getTransportIn() == 
null) {
-                mc.setTransportIn(ClientUtils.inferInTransport(cc
-                        .getAxisConfiguration(), options, mc));
-            } else if (mc.getTransportIn() == null) {
-                mc.setTransportIn(options.getTransportIn());
-            }
-
-            if (mc.getSoapAction() == null || "".equals(mc.getSoapAction())) {
-                String soapaction = axisOp.getSoapAction();
-                if (soapaction != null) {
-                    mc.setSoapAction(soapaction);
-                }
-            }
-            addReferenceParameters(mc);
-            if (options.isUseSeparateListener()) {
-
-                //options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
-                options.setTransportIn(mc.getConfigurationContext()
-                    .getAxisConfiguration().getTransportIn(new 
QName(Constants.TRANSPORT_HTTP)));
-
-                SynapseCallbackReceiver callbackReceiver = 
(SynapseCallbackReceiver) axisOp.getMessageReceiver();
-                callbackReceiver.addCallback(mc.getMessageID(), callback);
-                EndpointReference replyToFromTransport = 
mc.getConfigurationContext().getListenerManager().
-                        getEPRforService(sc.getAxisService().getName(), 
axisOp.getName().getLocalPart(), mc
-                                .getTransportOut().getName()
-                                .getLocalPart());
-
-                if (mc.getReplyTo() == null) {
-                    mc.setReplyTo(replyToFromTransport);
-                } else {
-                    
mc.getReplyTo().setAddress(replyToFromTransport.getAddress());
-                }
-                //if dont do this , this guy will wait till its gets HTTP 202 
in the case
-                //HTTP
-                mc.setProperty(MessageContext.TRANSPORT_NON_BLOCKING, 
Boolean.TRUE);
-                AxisEngine engine = new AxisEngine(cc);
-                
mc.getConfigurationContext().registerOperationContext(mc.getMessageID(), oc);
-                engine.send(mc);
-
-                // Options object reused so soapAction needs to be removed so
-                // that soapAction+wsa:Action on response don't conflict
-                options.setAction("");
-            } else {
-                if (block) {
-                    // Send the SOAP Message and receive a response
-                    MessageContext response = send(mc);
-                    // check for a fault and return the result
-                    if (response != null) {
-                        SOAPEnvelope resEnvelope = response.getEnvelope();
-                        if (resEnvelope.getBody().hasFault()) {
-                            SOAPFault soapFault = 
resEnvelope.getBody().getFault();
-
-                            //we need to call engine.receiveFault
-                            AxisEngine engine = new 
AxisEngine(mc.getConfigurationContext());
-                            engine.receiveFault(response);
-                        }
-                    }
-                    completed = true;
-                } else {
-                    sc.getConfigurationContext().getThreadPool().execute(
-                            new NonBlockingInvocationWorker(callback, mc));
-                }
-            }
-        }
-
-        private void addReferenceParameters(MessageContext msgctx) {
-            EndpointReference to = msgctx.getTo();
-            if (options.isManageSession()) {
-                EndpointReference tepr = sc.getTargetEPR();
-                if (tepr != null) {
-                    Map map = tepr.getAllReferenceParameters();
-                    if (map != null) {
-                        Iterator valuse = map.values().iterator();
-                        while (valuse.hasNext()) {
-                            Object refparaelement = valuse.next();
-                            if (refparaelement instanceof OMElement) {
-                                to.addReferenceParameter((OMElement) 
refparaelement);
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        /**
-         * Sends the message using a two way transport and waits for a response
-         *
-         * @param msgctx
-         * @return Returns MessageContext.
-         * @throws AxisFault
-         */
-        protected MessageContext send(MessageContext msgctx) throws AxisFault {
-
-            AxisEngine engine = new 
AxisEngine(msgctx.getConfigurationContext());
-
-            // create the responseMessageContext
-            MessageContext responseMessageContext = new MessageContext();
-
-            // This is a hack - Needs to change
-            responseMessageContext.setOptions(options);
-
-
-            responseMessageContext.setServerSide(false);
-            responseMessageContext.setMessageID(msgctx.getMessageID());
-            addMessageContext(responseMessageContext);
-
-            //sending the message
-            engine.send(msgctx);
-            responseMessageContext.setDoingREST(msgctx.isDoingREST());
-
-            responseMessageContext.setProperty(MessageContext.TRANSPORT_IN, 
msgctx
-                    .getProperty(MessageContext.TRANSPORT_IN));
-            responseMessageContext.setTransportIn(msgctx.getTransportIn());
-            responseMessageContext.setTransportOut(msgctx.getTransportOut());
-
-            // Options object reused above so soapAction needs to be removed so
-            // that soapAction+wsa:Action on response don't conflict
-            responseMessageContext.setSoapAction("");
-
-            if (responseMessageContext.getEnvelope() == null) {
-                // If request is REST we assume the responseMessageContext is 
REST, so
-                // set the variable
-
-                SOAPEnvelope resenvelope = TransportUtils.createSOAPMessage(
-                        responseMessageContext, 
msgctx.getEnvelope().getNamespace()
-                        .getNamespaceURI());
-                if (resenvelope != null) {
-                    responseMessageContext.setEnvelope(resenvelope);
-                    engine = new AxisEngine(msgctx.getConfigurationContext());
-                    engine.receive(responseMessageContext);
-                    if (responseMessageContext.getReplyTo() != null) {
-                        sc.setTargetEPR(responseMessageContext.getReplyTo());
-                    }
-                } else {
-                    throw new AxisFault(Messages
-                            .getMessage("blockingInvocationExpectsResponse"));
-                }
-            }
-            return responseMessageContext;
-        }
-
-        /**
-         * Resets the MEP client to a clean status after the MEP has 
completed. This
-         * is how you can reuse a MEP client. NOTE: this does not reset the 
options;
-         * only the internal state so the client can be used again.
-         *
-         * @throws AxisFault if reset is called before the MEP client has 
completed an
-         *                   interaction.
-         */
-        public void reset() throws AxisFault {
-            if (!completed) {
-                throw new AxisFault(Messages.getMessage("cannotreset"));
-            }
-            oc = null;
-            completed = false;
-        }
-
-        public void complete(MessageContext msgCtxt) throws AxisFault {
-            TransportOutDescription trsout = msgCtxt.getTransportOut();
-            if (trsout != null) {
-                trsout.getSender().cleanup(msgCtxt);
-            }
-        }
-
-        public OperationContext getOperationContext() {
-            return oc;
-        }
-
-        /**
-         * This class is the workhorse for a non-blocking invocation that uses 
a two
-         * way transport.
-         */
-        private class NonBlockingInvocationWorker implements Runnable {
-            private Callback callback;
-
-            private MessageContext msgctx;
-
-            public NonBlockingInvocationWorker(Callback callback,
-                                               MessageContext msgctx) {
-                this.callback = callback;
-                this.msgctx = msgctx;
-            }
-
-            public void run() {
-                try {
-                    // send the request and wait for reponse
-                    MessageContext response = send(msgctx);
-                    // call the callback
-                    if (response != null) {
-                        SOAPEnvelope resenvelope = response.getEnvelope();
-                        SOAPBody body = resenvelope.getBody();
-                        if (body.hasFault()) {
-                            Exception ex = body.getFault().getException();
-
-                            if (ex != null) {
-                                callback.onError(ex);
-                            } else {
-                                callback.onError(new Exception(body.getFault()
-                                        .getReason().getText()));
-                            }
-                        } else {
-                            AsyncResult asyncResult = new 
AsyncResult(response);
-
-                            callback.onComplete(asyncResult);
-                        }
-                    }
-
-                    callback.setComplete(true);
-                } catch (Exception e) {
-                    callback.onError(e);
-                }
-            }
-        }
-    }
+       public DynamicAxisOperation() {
+               super();
+       }
+
+       public DynamicAxisOperation(QName name) {
+               super(name);
+       }
+
+       public OperationClient createClient(ServiceContext sc, Options options) 
{
+               return new DynamicOperationClient(this, sc, options);
+       }
+
+       class DynamicOperationClient implements OperationClient {
+
+               private AxisOperation axisOp;
+
+               protected ServiceContext sc;
+
+               protected Options options;
+
+               protected OperationContext oc;
+
+               protected Callback callback;
+
+               /*
+                * indicates whether the MEP execution has completed (and hence 
ready
+                * for resetting)
+                */
+               boolean completed;
+
+               DynamicOperationClient(OutInAxisOperation axisOp, 
ServiceContext sc,
+                               Options options) {
+                       this.axisOp = axisOp;
+                       this.sc = sc;
+                       this.options = options;
+                       this.completed = false;
+                       this.oc = new OperationContext(axisOp);
+                       this.oc.setParent(this.sc);
+               }
+
+               /**
+                * Sets the options that should be used for this particular 
client. This
+                * resets the entire set of options to use the new options - so 
you'd
+                * lose any option cascading that may have been set up.
+                * 
+                * @param options
+                *            the options
+                */
+               public void setOptions(Options options) {
+                       this.options = options;
+               }
+
+               /**
+                * Returns the options used by this client. If you want to set 
a single
+                * option, then the right way is to call getOptions() and set 
specific
+                * options.
+                * 
+                * @return Returns the options, which will never be null.
+                */
+               public Options getOptions() {
+                       return options;
+               }
+
+               /**
+                * Adds message context to operation context , so that it will 
handle
+                * the logic correctly if the OperationContext is null then new 
one will
+                * be created , and Operation Context will become null when 
some one
+                * calls reset().
+                * 
+                * @param mc
+                * @throws AxisFault
+                */
+               public void addMessageContext(MessageContext mc) throws 
AxisFault {
+                       mc.setServiceContext(sc);
+                       if (mc.getMessageID() == null) {
+                               setMessageID(mc);
+                       }
+                       axisOp.registerOperationContext(mc, oc);
+               }
+
+               /**
+                * Returns the message context for a given message label.
+                * 
+                * @param messageLabel :
+                *            label of the message and that can be either "Out" 
or "In"
+                *            and nothing else
+                * @return Returns MessageContext.
+                * @throws AxisFault
+                */
+               public MessageContext getMessageContext(String messageLabel)
+                               throws AxisFault {
+                       return oc.getMessageContext(messageLabel);
+               }
+
+               public void setCallback(Callback callback) {
+                       this.callback = callback;
+               }
+
+               /**
+                * Create a message ID for the given message context if needed. 
If user
+                * gives an option with MessageID then just copy that into
+                * MessageContext , and with that there can be mutiple message 
with same
+                * MessageID unless user call setOption for each invocation. 
<p/> If
+                * user want to give message ID then the better way is to set 
the
+                * message ID in the option and call setOption for each 
invocation then
+                * the right thing will happen. <p/> If user does not give a 
message ID
+                * then the new one will be created and set that into Message 
Context.
+                * 
+                * @param mc
+                *            the message context whose id is to be set
+                */
+               private void setMessageID(MessageContext mc) {
+                       // now its the time to put the parameters set by the 
user in to the
+                       // correct places and to the
+                       // if there is no message id still, set a new one.
+                       String messageId = options.getMessageId();
+                       if (messageId == null || "".equals(messageId)) {
+                               messageId = UUIDGenerator.getUUID();
+                       }
+                       mc.setMessageID(messageId);
+               }
+
+               /**
+                * Executes the MEP. What this does depends on the specific MEP 
client.
+                * The basic idea is to have the MEP client execute and do 
something
+                * with the messages that have been added to it so far. For 
example, if
+                * its an Out-In MEP, then if the Out message has been set, then
+                * executing the client asks it to send the message and get the 
In
+                * message, possibly using a different thread.
+                * 
+                * @param block
+                *            Indicates whether execution should block or 
return ASAP.
+                *            What block means is of course a function of the 
specific
+                *            MEP client. IGNORED BY THIS MEP CLIENT.
+                * @throws AxisFault
+                *             if something goes wrong during the execution of 
the MEP.
+                */
+               public void execute(boolean block) throws AxisFault {
+                       if (completed) {
+                               throw new 
AxisFault(Messages.getMessage("mepiscomplted"));
+                       }
+                       ConfigurationContext cc = sc.getConfigurationContext();
+
+                       // copy interesting info from options to message 
context.
+                       MessageContext mc = oc
+                                       
.getMessageContext(WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
+                       if (mc == null) {
+                               throw new 
AxisFault(Messages.getMessage("outmsgctxnull"));
+                       }
+
+                       mc.setOptions(options);
+
+                       // do Target Resolution
+                       cc.getAxisConfiguration().getTargetResolverChain()
+                                       .resolveTarget(mc);
+
+                       // if the transport to use for sending is not 
specified, try to find
+                       // it
+                       // from the URL
+                       TransportOutDescription transportOut = 
options.getTransportOut();
+                       if (transportOut == null) {
+                               EndpointReference toEPR = (options.getTo() != 
null) ? options
+                                               .getTo() : mc.getTo();
+                               transportOut = ClientUtils.inferOutTransport(cc
+                                               .getAxisConfiguration(), toEPR, 
mc);
+                       }
+                       mc.setTransportOut(transportOut);
+
+                       if (options.getTransportIn() == null && 
mc.getTransportIn() == null) {
+                               
mc.setTransportIn(ClientUtils.inferInTransport(cc
+                                               .getAxisConfiguration(), 
options, mc));
+                       } else if (mc.getTransportIn() == null) {
+                               mc.setTransportIn(options.getTransportIn());
+                       }
+
+                       if (mc.getSoapAction() == null || 
"".equals(mc.getSoapAction())) {
+                               String soapaction = axisOp.getSoapAction();
+                               if (soapaction != null) {
+                                       mc.setSoapAction(soapaction);
+                               }
+                       }
+                       addReferenceParameters(mc);
+                       if (options.isUseSeparateListener()) {
+
+                               // 
options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
+                               
options.setTransportIn(mc.getConfigurationContext()
+                                               
.getAxisConfiguration().getTransportIn(
+                                                               new 
QName(Constants.TRANSPORT_HTTP)));
+
+                               SynapseCallbackReceiver callbackReceiver = 
(SynapseCallbackReceiver) axisOp
+                                               .getMessageReceiver();
+                               callbackReceiver.addCallback(mc.getMessageID(), 
callback);
+                               EndpointReference replyToFromTransport = mc
+                                               
.getConfigurationContext().getListenerManager()
+                                               
.getEPRforService(sc.getAxisService().getName(),
+                                                               
axisOp.getName().getLocalPart(),
+                                                               
mc.getTransportOut().getName().getLocalPart());
+
+                               if (mc.getReplyTo() == null) {
+                                       mc.setReplyTo(replyToFromTransport);
+                               } else {
+                                       mc.getReplyTo().setAddress(
+                                                       
replyToFromTransport.getAddress());
+                               }
+                               // if dont do this , this guy will wait till 
its gets HTTP 202
+                               // in the case
+                               // HTTP
+                               
mc.setProperty(MessageContext.TRANSPORT_NON_BLOCKING,
+                                               Boolean.TRUE);
+                               AxisEngine engine = new AxisEngine(cc);
+                               
mc.getConfigurationContext().registerOperationContext(
+                                               mc.getMessageID(), oc);
+                               engine.send(mc);
+
+                               // Options object reused so soapAction needs to 
be removed so
+                               // that soapAction+wsa:Action on response don't 
conflict
+                               options.setAction("");
+                       } else {
+                               if (block) {
+                                       // Send the SOAP Message and receive a 
response
+                                       MessageContext response = send(mc);
+                                       // check for a fault and return the 
result
+                                       if (response != null) {
+                                               SOAPEnvelope resEnvelope = 
response.getEnvelope();
+                                               if 
(resEnvelope.getBody().hasFault()) {
+                                                       SOAPFault soapFault = 
resEnvelope.getBody()
+                                                                       
.getFault();
+
+                                                       // we need to call 
engine.receiveFault
+                                                       AxisEngine engine = new 
AxisEngine(mc
+                                                                       
.getConfigurationContext());
+                                                       
engine.receiveFault(response);
+                                               }
+                                       }
+                                       completed = true;
+                               } else {
+                                       
sc.getConfigurationContext().getThreadPool().execute(
+                                                       new 
NonBlockingInvocationWorker(callback, mc));
+                               }
+                       }
+               }
+
+               private void addReferenceParameters(MessageContext msgctx) {
+                       EndpointReference to = msgctx.getTo();
+                       if (options.isManageSession()) {
+                               EndpointReference tepr = sc.getTargetEPR();
+                               if (tepr != null) {
+                                       Map map = 
tepr.getAllReferenceParameters();
+                                       if (map != null) {
+                                               Iterator valuse = 
map.values().iterator();
+                                               while (valuse.hasNext()) {
+                                                       Object refparaelement = 
valuse.next();
+                                                       if (refparaelement 
instanceof OMElement) {
+                                                               to
+                                                                               
.addReferenceParameter((OMElement) refparaelement);
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               /**
+                * Sends the message using a two way transport and waits for a 
response
+                * 
+                * @param msgctx
+                * @return Returns MessageContext.
+                * @throws AxisFault
+                */
+               protected MessageContext send(MessageContext msgctx) throws 
AxisFault {
+
+                       AxisEngine engine = new 
AxisEngine(msgctx.getConfigurationContext());
+
+                       // create the responseMessageContext
+                       MessageContext responseMessageContext = new 
MessageContext();
+
+                       // This is a hack - Needs to change
+                       responseMessageContext.setOptions(options);
+
+                       responseMessageContext.setServerSide(false);
+                       
responseMessageContext.setMessageID(msgctx.getMessageID());
+                       addMessageContext(responseMessageContext);
+
+                       // sending the message
+                       engine.send(msgctx);
+
+                       // fix case where there is no response message (in-only)
+                       if (msgctx.getOperationContext().getMessageContext(
+                                       
WSDL2Constants.MESSAGE_LABEL_OUT).getProperty(
+                                       MessageContext.TRANSPORT_IN) == null)
+                               return null;
+
+                       
responseMessageContext.setDoingREST(msgctx.isDoingREST());
+
+                       
responseMessageContext.setProperty(MessageContext.TRANSPORT_IN,
+                                       
msgctx.getProperty(MessageContext.TRANSPORT_IN));
+                       
responseMessageContext.setTransportIn(msgctx.getTransportIn());
+                       
responseMessageContext.setTransportOut(msgctx.getTransportOut());
+
+                       // Options object reused above so soapAction needs to 
be removed so
+                       // that soapAction+wsa:Action on response don't conflict
+                       responseMessageContext.setSoapAction("");
+
+                       if (responseMessageContext.getEnvelope() == null) {
+                               // If request is REST we assume the 
responseMessageContext is
+                               // REST, so
+                               // set the variable
+
+                               SOAPEnvelope resenvelope = 
TransportUtils.createSOAPMessage(
+                                               responseMessageContext, 
msgctx.getEnvelope()
+                                                               
.getNamespace().getNamespaceURI());
+                               if (resenvelope != null) {
+                                       
responseMessageContext.setEnvelope(resenvelope);
+                                       engine = new 
AxisEngine(msgctx.getConfigurationContext());
+                                       engine.receive(responseMessageContext);
+                                       if (responseMessageContext.getReplyTo() 
!= null) {
+                                               
sc.setTargetEPR(responseMessageContext.getReplyTo());
+                                       }
+                               } else {
+                                       throw new AxisFault(Messages
+                                                       
.getMessage("blockingInvocationExpectsResponse"));
+                               }
+                       }
+                       return responseMessageContext;
+               }
+
+               /**
+                * Resets the MEP client to a clean status after the MEP has 
completed.
+                * This is how you can reuse a MEP client. NOTE: this does not 
reset the
+                * options; only the internal state so the client can be used 
again.
+                * 
+                * @throws AxisFault
+                *             if reset is called before the MEP client has 
completed an
+                *             interaction.
+                */
+               public void reset() throws AxisFault {
+                       if (!completed) {
+                               throw new 
AxisFault(Messages.getMessage("cannotreset"));
+                       }
+                       oc = null;
+                       completed = false;
+               }
+
+               public void complete(MessageContext msgCtxt) throws AxisFault {
+                       TransportOutDescription trsout = 
msgCtxt.getTransportOut();
+                       if (trsout != null) {
+                               trsout.getSender().cleanup(msgCtxt);
+                       }
+               }
+
+               public OperationContext getOperationContext() {
+                       return oc;
+               }
+
+               /**
+                * This class is the workhorse for a non-blocking invocation 
that uses a
+                * two way transport.
+                */
+               private class NonBlockingInvocationWorker implements Runnable {
+                       private Callback callback;
+
+                       private MessageContext msgctx;
+
+                       public NonBlockingInvocationWorker(Callback callback,
+                                       MessageContext msgctx) {
+                               this.callback = callback;
+                               this.msgctx = msgctx;
+                       }
+
+                       public void run() {
+                               try {
+                                       // send the request and wait for reponse
+                                       MessageContext response = send(msgctx);
+                                       // call the callback
+                                       if (response != null) {
+                                               SOAPEnvelope resenvelope = 
response.getEnvelope();
+                                               SOAPBody body = 
resenvelope.getBody();
+                                               if (body.hasFault()) {
+                                                       Exception ex = 
body.getFault().getException();
+
+                                                       if (ex != null) {
+                                                               
callback.onError(ex);
+                                                       } else {
+                                                               
callback.onError(new Exception(body.getFault()
+                                                                               
.getReason().getText()));
+                                                       }
+                                               } else {
+                                                       AsyncResult asyncResult 
= new AsyncResult(response);
+
+                                                       
callback.onComplete(asyncResult);
+                                               }
+                                       }
+
+                                       callback.setComplete(true);
+                               } catch (Exception e) {
+                                       callback.onError(e);
+                               }
+                       }
+               }
+       }
 
 }



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

Reply via email to