Author: ffang
Date: Thu Feb 13 09:42:21 2014
New Revision: 1567872

URL: http://svn.apache.org/r1567872
Log:
Merged revisions 1567833 via svnmerge from 
https://svn.apache.org/repos/asf/cxf/branches/2.7.x-fixes

........
  r1567833 | ffang | 2014-02-13 10:47:19 +0800 (四, 13  2 2014) | 1 line
  
  [CXF-5550]CXF JAX-WS frontend DispatchImpl ignores setting of 
MessageContext.WSDL_OPERATION
........

Added:
    
cxf/branches/2.6.x-fixes/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/dispatch/DispatchOpTest.java
      - copied unchanged from r1567833, 
cxf/branches/2.7.x-fixes/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/dispatch/DispatchOpTest.java
    
cxf/branches/2.6.x-fixes/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/dispatch/DispatchTest.wsdl
      - copied unchanged from r1567833, 
cxf/branches/2.7.x-fixes/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/dispatch/DispatchTest.wsdl
    
cxf/branches/2.6.x-fixes/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/dispatch/OperationRequest.xml
      - copied unchanged from r1567833, 
cxf/branches/2.7.x-fixes/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/dispatch/OperationRequest.xml
    
cxf/branches/2.6.x-fixes/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/dispatch/OperationResponse.xml
      - copied unchanged from r1567833, 
cxf/branches/2.7.x-fixes/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/dispatch/OperationResponse.xml
Modified:
    cxf/branches/2.6.x-fixes/   (props changed)
    
cxf/branches/2.6.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java

Propchange: cxf/branches/2.6.x-fixes/
------------------------------------------------------------------------------
  Merged /cxf/branches/2.7.x-fixes:r1567833

Propchange: cxf/branches/2.6.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.

Modified: 
cxf/branches/2.6.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java
URL: 
http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java?rev=1567872&r1=1567871&r2=1567872&view=diff
==============================================================================
--- 
cxf/branches/2.6.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java
 (original)
+++ 
cxf/branches/2.6.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java
 Thu Feb 13 09:42:21 2014
@@ -308,9 +308,12 @@ public class DispatchImpl<T> implements 
             QName opName = 
(QName)getRequestContext().get(MessageContext.WSDL_OPERATION);
             boolean findDispatchOp = 
Boolean.TRUE.equals(getRequestContext().get("find.dispatch.operation"));
             
+            boolean hasOpName;
             if (opName == null) {
+                hasOpName = false;
                 opName = isOneWay ? INVOKE_ONEWAY_QNAME : INVOKE_QNAME;
             } else {
+                hasOpName = true;
                 BindingOperationInfo bop = client.getEndpoint().getBinding()
                                             
.getBindingInfo().getOperation(opName);
                 if (bop == null) {
@@ -340,10 +343,10 @@ public class DispatchImpl<T> implements 
                     }
                 }
             }
-            Map<String, QName> payloadOPMap = 
-                
createPayloadEleOpNameMap(client.getEndpoint().getBinding().getBindingInfo());
+            Map<String, QName> payloadOPMap = createPayloadEleOpNameMap(
+                    client.getEndpoint().getBinding().getBindingInfo(), 
hasOpName);
             if (findDispatchOp && !payloadOPMap.isEmpty()) {
-                String payloadElementName = null;              
+                QName payloadElementName = null;
                 if (obj instanceof javax.xml.transform.Source) {
                     XMLStreamReader reader = null;
                     try {
@@ -367,7 +370,24 @@ public class DispatchImpl<T> implements 
                 }
 
                 if (payloadElementName != null) {
-                    QName dispatchedOpName = 
payloadOPMap.get(payloadElementName);
+                    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);
@@ -436,7 +456,7 @@ public class DispatchImpl<T> implements 
         return client;
     }
     
-    private String getPayloadElementName(Element ele) {
+    private QName getPayloadElementName(Element ele) {
         XMLStreamReader xmlreader = StaxUtils.createXMLStreamReader(ele);
         DepthXMLStreamReader reader = new DepthXMLStreamReader(xmlreader);
         try {
@@ -444,14 +464,14 @@ public class DispatchImpl<T> implements 
 
                 StaxUtils.skipToStartOfElement(reader);
 
-                return reader.getName().toString();
+                return reader.getName();
             }
             if (this.mode == Service.Mode.MESSAGE) {
                 StaxUtils.skipToStartOfElement(reader);
                 StaxUtils.toNextTag(reader,
                                     new QName(ele.getNamespaceURI(), "Body"));
                 reader.nextTag();
-                return reader.getName().toString();
+                return reader.getName();
             }
         } catch (XMLStreamException e) {
             // ignore
@@ -461,12 +481,12 @@ public class DispatchImpl<T> implements 
     }
     
     
-    private String getPayloadElementName(SOAPMessage soapMessage) {
+    private QName getPayloadElementName(SOAPMessage soapMessage) {
         try {            
             // we only care about the first element node, not text nodes
             Element element = 
DOMUtils.getFirstElement(SAAJUtils.getBody(soapMessage));
             if (element != null) {
-                return DOMUtils.getElementQName(element).toString();
+                return DOMUtils.getElementQName(element);
             }
         } catch (Exception e) {
             //ignore
@@ -474,7 +494,7 @@ public class DispatchImpl<T> implements 
         return null;
     }
     
-    private String getPayloadElementName(Object object) {
+    private QName getPayloadElementName(Object object) {
         JAXBDataBinding dataBinding = new JAXBDataBinding();
         dataBinding.setContext(context);
         DataWriter<XMLStreamWriter> dbwriter = 
dataBinding.createWriter(XMLStreamWriter.class);
@@ -492,7 +512,7 @@ public class DispatchImpl<T> implements 
 
                 StaxUtils.skipToStartOfElement(reader);
 
-                return reader.getName().toString();
+                return reader.getName();
 
             }
         } catch (XMLStreamException e) {
@@ -504,7 +524,7 @@ public class DispatchImpl<T> implements 
         return null;
     }
     
-    private Map<String, QName> createPayloadEleOpNameMap(BindingInfo 
bindingInfo) {
+    private Map<String, QName> createPayloadEleOpNameMap(BindingInfo 
bindingInfo, boolean reverseMapping) {
         Map<String, QName> payloadElementMap = new java.util.HashMap<String, 
QName>();
         // assume a document binding style, which is default according to W3C 
spec on WSDL
         String bindingStyle = "document";
@@ -526,12 +546,17 @@ public class DispatchImpl<T> implements 
                         && 
!bop.getOperationInfo().getInput().getMessageParts().isEmpty()) {
                         QName qn = 
bop.getOperationInfo().getInput().getMessagePartByIndex(0)
                             .getElementQName();
-                        payloadElementMap.put(qn.toString(), 
bop.getOperationInfo().getName());
+                        QName op = bop.getOperationInfo().getName();
+                        if (reverseMapping) {
+                            payloadElementMap.put(op.toString(), qn);
+                        } else {
+                            payloadElementMap.put(qn.toString(), op);
+                        }
                     }
                 } else if ("rpc".equals(operationStyle)) {
                     // if rpc
-                    
payloadElementMap.put(bop.getOperationInfo().getName().toString(), 
bop.getOperationInfo()
-                        .getName());
+                    QName op = bop.getOperationInfo().getName();
+                    payloadElementMap.put(op.toString(), op);
                 }
             }
         }
@@ -541,5 +566,4 @@ public class DispatchImpl<T> implements 
     public void close() throws IOException {
         client.destroy();
     }
-    
 }


Reply via email to