You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-commits@axis.apache.org by am...@apache.org on 2011/02/22 15:04:32 UTC

svn commit: r1073331 - in /axis/axis2/java/core/trunk/modules/transport/local/src/org/apache/axis2/transport/local: LocalResponder.java LocalTransportReceiver.java LocalTransportSender.java NonBlockingLocalTransportSender.java

Author: amilas
Date: Tue Feb 22 14:04:31 2011
New Revision: 1073331

URL: http://svn.apache.org/viewvc?rev=1073331&view=rev
Log:
applying the patch for AXIS2-4944

Added:
    axis/axis2/java/core/trunk/modules/transport/local/src/org/apache/axis2/transport/local/NonBlockingLocalTransportSender.java
Modified:
    axis/axis2/java/core/trunk/modules/transport/local/src/org/apache/axis2/transport/local/LocalResponder.java
    axis/axis2/java/core/trunk/modules/transport/local/src/org/apache/axis2/transport/local/LocalTransportReceiver.java
    axis/axis2/java/core/trunk/modules/transport/local/src/org/apache/axis2/transport/local/LocalTransportSender.java

Modified: axis/axis2/java/core/trunk/modules/transport/local/src/org/apache/axis2/transport/local/LocalResponder.java
URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/transport/local/src/org/apache/axis2/transport/local/LocalResponder.java?rev=1073331&r1=1073330&r2=1073331&view=diff
==============================================================================
--- axis/axis2/java/core/trunk/modules/transport/local/src/org/apache/axis2/transport/local/LocalResponder.java (original)
+++ axis/axis2/java/core/trunk/modules/transport/local/src/org/apache/axis2/transport/local/LocalResponder.java Tue Feb 22 14:04:31 2011
@@ -20,32 +20,40 @@
 
 package org.apache.axis2.transport.local;
 
+import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.soap.SOAPEnvelope;
 import org.apache.axis2.AxisFault;
+import org.apache.axis2.Constants;
 import org.apache.axis2.addressing.EndpointReference;
+import org.apache.axis2.addressing.RelatesTo;
+import org.apache.axis2.builder.BuilderUtil;
 import org.apache.axis2.context.ConfigurationContext;
 import org.apache.axis2.context.MessageContext;
 import org.apache.axis2.description.TransportOutDescription;
+import org.apache.axis2.description.WSDL2Constants;
+import org.apache.axis2.engine.AxisEngine;
 import org.apache.axis2.handlers.AbstractHandler;
 import org.apache.axis2.transport.TransportSender;
 import org.apache.axis2.transport.TransportUtils;
+import org.apache.axis2.wsdl.WSDLConstants;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
-import java.io.ByteArrayOutputStream;
-import java.io.OutputStream;
+import javax.xml.stream.XMLStreamException;
+import java.io.*;
+import java.util.Map;
 
 /**
  * LocalResponder
  */
 public class LocalResponder extends AbstractHandler implements TransportSender {
     protected static final Log log = LogFactory.getLog(LocalResponder.class);
-    
-    
+
     //  fixed for Executing LocalTransport in MulthThread. 
     private OutputStream out;
 
     public LocalResponder(OutputStream response) {
-        this.out = response;        
+        this.out = response;
     }
 
     public void init(ConfigurationContext confContext, TransportOutDescription transportOut)
@@ -87,13 +95,38 @@ public class LocalResponder extends Abst
                     TransportUtils.writeMessage(msgContext, out);
                 }
             } else {
-                out = (OutputStream) msgContext.getProperty(MessageContext.TRANSPORT_OUT);
+                if (/*(msgContext != null) &&*/ (msgContext.getOperationContext() != null) &&
+                        (msgContext.getOperationContext().getMessageContexts() != null)) {
+                    MessageContext proxyInMessageContext = msgContext.
+                            getOperationContext().getMessageContext(WSDL2Constants.MESSAGE_LABEL_IN);
+
+                    if (proxyInMessageContext != null) {
+                        MessageContext initialMessageContext = (MessageContext) proxyInMessageContext.
+                                getProperty(LocalTransportReceiver.IN_MESSAGE_CONTEXT);
+
+                        if (initialMessageContext != null) {
+                            handleResponse(msgContext, initialMessageContext);
+                        } else {
+                            out = (OutputStream) msgContext.getProperty(MessageContext.TRANSPORT_OUT);
+
+                            if (out != null) {
+                                TransportUtils.writeMessage(msgContext, out);
+                            } else {
+                                throw new AxisFault(
+                                        "Both the TO and Property MessageContext.TRANSPORT_OUT is Null, No where to send");
+                            }
 
-                if (out != null) {
-                    TransportUtils.writeMessage(msgContext, out);
+                        }
+                    }
                 } else {
-                    throw new AxisFault(
-                            "Both the TO and Property MessageContext.TRANSPORT_OUT is Null, No where to send");
+                    out = (OutputStream) msgContext.getProperty(MessageContext.TRANSPORT_OUT);
+
+                    if (out != null) {
+                        TransportUtils.writeMessage(msgContext, out);
+                    } else {
+                        throw new AxisFault(
+                                "Both the TO and Property MessageContext.TRANSPORT_OUT is Null, No where to send");
+                    }
                 }
             }
         } catch (AxisFault axisFault) {
@@ -103,7 +136,72 @@ public class LocalResponder extends Abst
         }
 
         TransportUtils.setResponseWritten(msgContext, true);
-        
+
         return InvocationResponse.CONTINUE;
     }
+
+    /**
+     * Retrieves the properties from the proxyOutMessageContext and sets the values to the
+     * inMessageContext.
+     *
+     * @param proxyOutMessageContext the active message context
+     * @param initialMessageContext  the initial message context, which was stored as a property
+     *                               in the proxyOutMessageContext
+     * @throws AxisFault AxisFault
+     */
+    private void handleResponse(MessageContext proxyOutMessageContext, MessageContext initialMessageContext) throws AxisFault {
+        MessageContext inMessageContext = initialMessageContext.getOperationContext().
+                getMessageContext(WSDL2Constants.MESSAGE_LABEL_IN);
+
+        // setting the properties
+        Map<String, Object> initialPropertyMap = initialMessageContext.getProperties();
+        initialMessageContext.setProperties(initialPropertyMap);
+
+        inMessageContext.setEnvelope(getEnvelope(proxyOutMessageContext));
+        inMessageContext.setAxisServiceGroup(initialMessageContext.getAxisServiceGroup());
+        inMessageContext.setAxisService(initialMessageContext.getAxisService());
+        inMessageContext.setAxisOperation(initialMessageContext.getAxisOperation());
+        inMessageContext.setAxisMessage(initialMessageContext.getAxisOperation().getMessage(
+                WSDLConstants.MESSAGE_LABEL_OUT_VALUE));
+        inMessageContext.setIncomingTransportName(Constants.TRANSPORT_LOCAL);
+        inMessageContext.setServiceContext(initialMessageContext.getServiceContext());
+
+        // set properties on response
+        inMessageContext.setServerSide(true);
+        inMessageContext.setProperty(MessageContext.TRANSPORT_OUT,
+                initialMessageContext.getProperty(MessageContext.TRANSPORT_OUT));
+        inMessageContext.setProperty(Constants.OUT_TRANSPORT_INFO,
+                initialMessageContext.getProperty(Constants.OUT_TRANSPORT_INFO));
+        inMessageContext.setTransportIn(initialMessageContext.getTransportIn());
+        inMessageContext.setTransportOut(initialMessageContext.getTransportOut());
+
+        // copy the message type property that is used by the out message to the response message
+        inMessageContext.setProperty(Constants.Configuration.MESSAGE_TYPE,
+                initialMessageContext.getProperty(Constants.Configuration.MESSAGE_TYPE));
+
+        if (initialMessageContext.getMessageID() != null) {
+            inMessageContext.setRelationships(
+                    new RelatesTo[]{new RelatesTo(initialMessageContext.getMessageID())});
+        }
+
+        inMessageContext.setReplyTo(initialMessageContext.getReplyTo());
+        inMessageContext.setFaultTo(initialMessageContext.getFaultTo());
+
+        AxisEngine.receive(inMessageContext);
+    }
+
+    private SOAPEnvelope getEnvelope(MessageContext messageContext) throws AxisFault {
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        TransportUtils.writeMessage(messageContext, out);
+
+        ByteArrayInputStream bs = new ByteArrayInputStream(out.toByteArray());
+        OMXMLParserWrapper builder;
+        try {
+            builder = BuilderUtil.getBuilder(bs);
+        } catch (XMLStreamException e) {
+            throw AxisFault.makeFault(e);
+        }
+
+        return TransportUtils.createSOAPEnvelope(builder.getDocumentElement());
+    }
 }

Modified: axis/axis2/java/core/trunk/modules/transport/local/src/org/apache/axis2/transport/local/LocalTransportReceiver.java
URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/transport/local/src/org/apache/axis2/transport/local/LocalTransportReceiver.java?rev=1073331&r1=1073330&r2=1073331&view=diff
==============================================================================
--- axis/axis2/java/core/trunk/modules/transport/local/src/org/apache/axis2/transport/local/LocalTransportReceiver.java (original)
+++ axis/axis2/java/core/trunk/modules/transport/local/src/org/apache/axis2/transport/local/LocalTransportReceiver.java Tue Feb 22 14:04:31 2011
@@ -43,6 +43,10 @@ public class LocalTransportReceiver {
     public static ConfigurationContext CONFIG_CONTEXT;
     private ConfigurationContext confContext;
     private MessageContext inMessageContext;
+    /** Whether the call is blocking or non-blocking */
+    private boolean nonBlocking = false;
+    /** If the call is non-blocking the in message context will be stored in this property */
+    public static final String IN_MESSAGE_CONTEXT = "IN_MESSAGE_CONTEXT";
 
     public LocalTransportReceiver(ConfigurationContext configContext) {
         confContext = configContext;
@@ -52,6 +56,11 @@ public class LocalTransportReceiver {
         this(CONFIG_CONTEXT);
     }
 
+    public LocalTransportReceiver(LocalTransportSender sender, boolean nonBlocking) {
+        this(CONFIG_CONTEXT);
+        this.nonBlocking = nonBlocking;
+    }
+
     public void processMessage(MessageContext inMessageContext,
                                InputStream in,
                                OutputStream response) throws AxisFault {
@@ -79,6 +88,12 @@ public class LocalTransportReceiver {
                                OutputStream response)
             throws AxisFault {
         MessageContext msgCtx = confContext.createMessageContext();
+
+        if (this.nonBlocking) {
+            // Set the in-message context as a property to the  current message context.
+            msgCtx.setProperty(IN_MESSAGE_CONTEXT, inMessageContext);
+        }
+
         if (inMessageContext != null) {
             msgCtx.setProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST,
                                inMessageContext.getProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST));

Modified: axis/axis2/java/core/trunk/modules/transport/local/src/org/apache/axis2/transport/local/LocalTransportSender.java
URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/transport/local/src/org/apache/axis2/transport/local/LocalTransportSender.java?rev=1073331&r1=1073330&r2=1073331&view=diff
==============================================================================
--- axis/axis2/java/core/trunk/modules/transport/local/src/org/apache/axis2/transport/local/LocalTransportSender.java (original)
+++ axis/axis2/java/core/trunk/modules/transport/local/src/org/apache/axis2/transport/local/LocalTransportSender.java Tue Feb 22 14:04:31 2011
@@ -98,7 +98,7 @@ public class LocalTransportSender extend
             InputStream in = new ByteArrayInputStream(out.toByteArray());
             ByteArrayOutputStream response = new ByteArrayOutputStream();
 
-            LocalTransportReceiver localTransportReceiver = new LocalTransportReceiver(this);
+            LocalTransportReceiver localTransportReceiver = new LocalTransportReceiver(this, isNonBlocking());
             localTransportReceiver.processMessage(msgContext, in, response);
 
             in.close();
@@ -111,4 +111,8 @@ public class LocalTransportSender extend
             throw AxisFault.makeFault(e);
         }
     }
+
+    private boolean isNonBlocking() {
+        return false;
+    }
 }

Added: axis/axis2/java/core/trunk/modules/transport/local/src/org/apache/axis2/transport/local/NonBlockingLocalTransportSender.java
URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/transport/local/src/org/apache/axis2/transport/local/NonBlockingLocalTransportSender.java?rev=1073331&view=auto
==============================================================================
--- axis/axis2/java/core/trunk/modules/transport/local/src/org/apache/axis2/transport/local/NonBlockingLocalTransportSender.java (added)
+++ axis/axis2/java/core/trunk/modules/transport/local/src/org/apache/axis2/transport/local/NonBlockingLocalTransportSender.java Tue Feb 22 14:04:31 2011
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.axis2.transport.local;
+
+public class NonBlockingLocalTransportSender extends LocalTransportSender {
+
+    private boolean isNonBlocking() {
+        return true;
+    }
+
+}