You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2014/07/11 21:11:46 UTC

[3/7] git commit: [CXF-5871] Fix dispatch.invokeAsync not sending proper Action

[CXF-5871] Fix dispatch.invokeAsync not sending proper Action

Conflicts:
	rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java


Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/2ede9f90
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/2ede9f90
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/2ede9f90

Branch: refs/heads/2.6.x-fixes
Commit: 2ede9f90eb8e9a3ca4ec393b87353cd0d4be9422
Parents: 1da5667
Author: Daniel Kulp <dk...@apache.org>
Authored: Fri Jul 11 12:44:03 2014 -0400
Committer: Daniel Kulp <dk...@apache.org>
Committed: Fri Jul 11 14:50:46 2014 -0400

----------------------------------------------------------------------
 .../java/org/apache/cxf/jaxws/DispatchImpl.java | 182 ++++++++++---------
 1 file changed, 99 insertions(+), 83 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/2ede9f90/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java b/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java
index c537a3d..7433abe 100644
--- a/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java
+++ b/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java
@@ -40,11 +40,13 @@ import javax.xml.soap.SOAPMessage;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.stream.XMLStreamWriter;
+import javax.xml.transform.Source;
 import javax.xml.ws.AsyncHandler;
 import javax.xml.ws.Binding;
 import javax.xml.ws.BindingProvider;
 import javax.xml.ws.Dispatch;
 import javax.xml.ws.EndpointReference;
+import javax.xml.ws.Holder;
 import javax.xml.ws.Response;
 import javax.xml.ws.Service;
 import javax.xml.ws.WebServiceException;
@@ -54,6 +56,7 @@ import javax.xml.ws.http.HTTPBinding;
 import javax.xml.ws.http.HTTPException;
 import javax.xml.ws.soap.SOAPBinding;
 import javax.xml.ws.soap.SOAPFaultException;
+
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
@@ -306,7 +309,6 @@ public class DispatchImpl<T> implements Dispatch<T>, BindingProvider, Closeable
                 getRequestContext().put("unwrap.jaxb.element", unwrapProperty);
             }
             QName opName = (QName)getRequestContext().get(MessageContext.WSDL_OPERATION);
-            boolean findDispatchOp = Boolean.TRUE.equals(getRequestContext().get("find.dispatch.operation"));
             
             boolean hasOpName;
             if (opName == null) {
@@ -320,99 +322,106 @@ public class DispatchImpl<T> implements Dispatch<T>, BindingProvider, Closeable
                     addInvokeOperation(opName, isOneWay);
                 }
             }
+            Holder<T> holder = new Holder<T>(obj);
+            opName = calculateOpName(holder, opName, hasOpName);
             
-            //CXF-2836 : find the operation for the dispatched object
-            // if findDispatchOp is already true, skip the addressing feature lookup.
-            // if the addressing feature is enabled, set findDispatchOp to true
-            if (!findDispatchOp) {
-                // the feature list to be searched is the endpoint and the bus's lists
-                List<AbstractFeature> endpointFeatures 
-                    = ((JaxWsClientEndpointImpl)client.getEndpoint()).getFeatures();
-                List<AbstractFeature> allFeatures;
-                if (client.getBus().getFeatures() != null) {
-                    allFeatures = new ArrayList<AbstractFeature>(endpointFeatures.size() 
-                        + client.getBus().getFeatures().size());
-                    allFeatures.addAll(endpointFeatures);
-                    allFeatures.addAll(client.getBus().getFeatures());
-                } else {
-                    allFeatures = endpointFeatures;
-                }
-                for (AbstractFeature feature : allFeatures) {
-                    if (feature instanceof WSAddressingFeature) {
-                        findDispatchOp = true; 
-                    }
+            Object ret[] = client.invokeWrapped(opName,
+                                                holder.value);
+            if (isOneWay || ret == null || ret.length == 0) {
+                return null;
+            }
+            return (T)ret[0];
+        } catch (Exception ex) {
+            throw mapException(ex);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    private QName calculateOpName(Holder<T> holder, QName opName, boolean hasOpName) throws XMLStreamException {
+        boolean findDispatchOp = Boolean.TRUE.equals(getRequestContext().get("find.dispatch.operation"));
+
+        //CXF-2836 : find the operation for the dispatched object
+        // if findDispatchOp is already true, skip the addressing feature lookup.
+        // if the addressing feature is enabled, set findDispatchOp to true
+        if (!findDispatchOp) {
+            // the feature list to be searched is the endpoint and the bus's lists
+            List<Feature> endpointFeatures 
+                = ((JaxWsClientEndpointImpl)client.getEndpoint()).getFeatures();
+            List<Feature> allFeatures;
+            if (client.getBus().getFeatures() != null) {
+                allFeatures = new ArrayList<Feature>(endpointFeatures.size() 
+                    + client.getBus().getFeatures().size());
+                allFeatures.addAll(endpointFeatures);
+                allFeatures.addAll(client.getBus().getFeatures());
+            } else {
+                allFeatures = endpointFeatures;
+            }
+            for (Feature feature : allFeatures) {
+                if (feature instanceof WSAddressingFeature) {
+                    findDispatchOp = true; 
                 }
             }
-            Map<String, QName> payloadOPMap = createPayloadEleOpNameMap(
-                    client.getEndpoint().getBinding().getBindingInfo(), hasOpName);
-            if (findDispatchOp && !payloadOPMap.isEmpty()) {
-                QName payloadElementName = null;
-                if (obj instanceof javax.xml.transform.Source) {
-                    XMLStreamReader reader = null;
-                    try {
-                        reader = StaxUtils.createXMLStreamReader((javax.xml.transform.Source)obj);
-                        Document document = StaxUtils.read(reader);
-                        createdSource = new StaxSource(StaxUtils.createXMLStreamReader(document));
-                        payloadElementName = getPayloadElementName(document.getDocumentElement());
-                    } catch (Exception e) {                        
-                        // ignore, we are trying to get the operation name
-                    } finally {
-                        StaxUtils.close(reader);
-                    }
+        }
+        Source createdSource = null;
+        Map<String, QName> payloadOPMap = createPayloadEleOpNameMap(
+                client.getEndpoint().getBinding().getBindingInfo(), hasOpName);
+        if (findDispatchOp && !payloadOPMap.isEmpty()) {
+            QName payloadElementName = null;
+            if (holder.value instanceof javax.xml.transform.Source) {
+                XMLStreamReader reader = null;
+                try {
+                    reader = StaxUtils.createXMLStreamReader((javax.xml.transform.Source)holder.value);
+                    Document document = StaxUtils.read(reader);
+                    createdSource = new StaxSource(StaxUtils.createXMLStreamReader(document));
+                    payloadElementName = getPayloadElementName(document.getDocumentElement());
+                } catch (Exception e) {                        
+                    // ignore, we are trying to get the operation name
+                } finally {
+                    StaxUtils.close(reader);
                 }
-                if (obj instanceof SOAPMessage) {
-                    payloadElementName = getPayloadElementName((SOAPMessage)obj);
+            }
+            if (holder.value instanceof SOAPMessage) {
+                payloadElementName = getPayloadElementName((SOAPMessage)holder.value);
 
-                }
+            }
 
-                if (this.context != null) {
-                    payloadElementName = getPayloadElementName(obj);
-                }
+            if (this.context != null) {
+                payloadElementName = getPayloadElementName(holder.value);
+            }
 
-                if (payloadElementName != null) {
-                    if (hasOpName) {
-                        // Verify the payload element against the given operation name.
-                        // This allows graceful handling of non-standard WSDL definitions
-                        // where different operations have the same payload element.
-                        QName expectedElementName = payloadOPMap.get(opName.toString());
-                        if (expectedElementName == null || !expectedElementName.toString().equals(
-                                payloadElementName.toString())) {
-                            // Verification of the provided operation name failed.
-                            // Resolve the operation name from the payload element.
-                            hasOpName = false;
-                            payloadOPMap = createPayloadEleOpNameMap(
-                                    client.getEndpoint().getBinding().getBindingInfo(), hasOpName);
-                        }
+            if (payloadElementName != null) {
+                if (hasOpName) {
+                    // Verify the payload element against the given operation name.
+                    // This allows graceful handling of non-standard WSDL definitions
+                    // where different operations have the same payload element.
+                    QName expectedElementName = payloadOPMap.get(opName.toString());
+                    if (expectedElementName == null || !expectedElementName.toString().equals(
+                            payloadElementName.toString())) {
+                        // Verification of the provided operation name failed.
+                        // Resolve the operation name from the payload element.
+                        hasOpName = false;
+                        payloadOPMap = createPayloadEleOpNameMap(
+                                client.getEndpoint().getBinding().getBindingInfo(), hasOpName);
                     }
-                    QName dispatchedOpName = null;
-                    if (!hasOpName) {
-                        dispatchedOpName = payloadOPMap.get(payloadElementName.toString());
-                    }
-                    if (null != dispatchedOpName) {
-                        BindingOperationInfo bop = client.getEndpoint().getBinding().getBindingInfo()
-                          .getOperation(opName);
-                        BindingOperationInfo dbop = client.getEndpoint().getBinding().getBindingInfo()
-                          .getOperation(dispatchedOpName);
-                        if (bop != null) {
-                            // set the actual binding operation object to this dispatch operation
-                            bop.setProperty("dispatchToOperation", dbop);
-                        }
+                }
+                QName dispatchedOpName = null;
+                if (!hasOpName) {
+                    dispatchedOpName = payloadOPMap.get(payloadElementName.toString());
+                }
+                if (null != dispatchedOpName) {
+                    BindingOperationInfo dbop = client.getEndpoint().getBinding().getBindingInfo()
+                        .getOperation(dispatchedOpName);
+                    if (dbop != null) {
+                        opName = dispatchedOpName;
                     }
                 }
-            } 
-            
-            
-            Object ret[] = client.invokeWrapped(opName,
-                                                createdSource == null ? obj : createdSource);
-            if (isOneWay || ret == null || ret.length == 0) {
-                return null;
             }
-            return (T)ret[0];
-        } catch (Exception ex) {
-            throw mapException(ex);
         }
+        if (createdSource != null) {
+            holder.value = (T)createdSource;
+        }
+        return opName;
     }
-
   
     public Future<?> invokeAsync(T obj, AsyncHandler<T> asyncHandler) {
         checkError();
@@ -421,11 +430,15 @@ public class DispatchImpl<T> implements Dispatch<T>, BindingProvider, Closeable
         ClientCallback callback = new JaxwsClientCallback<T>(asyncHandler, this);
              
         Response<T> ret = new JaxwsResponseCallback<T>(callback);
-        try {
+        try {           
+            boolean hasOpName;
+            
             QName opName = (QName)getRequestContext().get(MessageContext.WSDL_OPERATION);
             if (opName == null) {
+                hasOpName = false;
                 opName = INVOKE_QNAME;
             } else {
+                hasOpName = true;
                 BindingOperationInfo bop = client.getEndpoint().getBinding()
                     .getBindingInfo().getOperation(opName);
                 if (bop == null) {
@@ -433,9 +446,12 @@ public class DispatchImpl<T> implements Dispatch<T>, BindingProvider, Closeable
                 }
             }
 
+            Holder<T> holder = new Holder<T>(obj);
+            opName = calculateOpName(holder, opName, hasOpName);
+            
             client.invokeWrapped(callback, 
                                  opName,
-                                 obj);
+                                 holder.value);
             
             return ret;
         } catch (Exception ex) {