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 2008/07/16 21:23:05 UTC

svn commit: r677385 - in /cxf/trunk: api/src/main/java/org/apache/cxf/service/model/ rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/ tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/

Author: dkulp
Date: Wed Jul 16 12:23:05 2008
New Revision: 677385

URL: http://svn.apache.org/viewvc?rev=677385&view=rev
Log:
[CXF-1696] Fix problems occuring when a wsdl is used that has out of band headers using the same part names as parts in the real message.

Modified:
    cxf/trunk/api/src/main/java/org/apache/cxf/service/model/AbstractMessageContainer.java
    cxf/trunk/api/src/main/java/org/apache/cxf/service/model/MessagePartInfo.java
    cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapBindingFactory.java
    cxf/trunk/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/pizza_wrapped.wsdl

Modified: cxf/trunk/api/src/main/java/org/apache/cxf/service/model/AbstractMessageContainer.java
URL: http://svn.apache.org/viewvc/cxf/trunk/api/src/main/java/org/apache/cxf/service/model/AbstractMessageContainer.java?rev=677385&r1=677384&r2=677385&view=diff
==============================================================================
--- cxf/trunk/api/src/main/java/org/apache/cxf/service/model/AbstractMessageContainer.java (original)
+++ cxf/trunk/api/src/main/java/org/apache/cxf/service/model/AbstractMessageContainer.java Wed Jul 16 12:23:05 2008
@@ -33,6 +33,7 @@
     private OperationInfo operation;
     private Map<QName, MessagePartInfo> messageParts 
         = new LinkedHashMap<QName, MessagePartInfo>(4);
+    private List<MessagePartInfo> outOfBandParts;
     
     /**
      * Initializes a new instance of the <code>MessagePartContainer</code>.
@@ -102,6 +103,12 @@
             }
             i++;
         }
+        for (MessagePartInfo p : getOutOfBandParts()) {
+            if (part == p) {
+                return i;
+            }
+            i++;
+        }
         return -1;
     }
 
@@ -111,6 +118,11 @@
                 return p;
             }
         }
+        for (MessagePartInfo p : getOutOfBandParts()) {
+            if (p.getIndex() == i) {
+                return p;
+            }
+        }
         return null;
     }
 
@@ -141,6 +153,12 @@
                 }
             }
         }
+        for (MessagePartInfo mpi2 : getOutOfBandParts()) {
+            if (name.equals(mpi2.getName())
+                || name.equals(mpi2.getConcreteName())) {
+                return mpi2;
+            }
+        }
         return mpi;
     }
     
@@ -154,7 +172,7 @@
         if (n == -1) {
             return null;
         }
-        for (MessagePartInfo mpi : messageParts.values()) {
+        for (MessagePartInfo mpi : getMessageParts()) {
             if (n == 0) {
                 return mpi;
             }
@@ -163,17 +181,42 @@
         return null;
     }    
     
+    
+    public MessagePartInfo addOutOfBandMessagePart(QName name) {
+        if (name == null) {
+            throw new IllegalArgumentException("Invalid name [" + name + "]");
+        }
+
+        MessagePartInfo part = new MessagePartInfo(name, this);
+        if (outOfBandParts == null) {
+            outOfBandParts = new ArrayList<MessagePartInfo>(1);
+        }
+        part.setIndex(messageParts.size() + outOfBandParts.size());
+        outOfBandParts.add(part);
+        return part;
+    }
+
+    
+    
     /**
      * Returns all message parts for this message.
      *
      * @return all message parts.
      */
     public List<MessagePartInfo> getMessageParts() {
-        return Collections.unmodifiableList(new ArrayList<MessagePartInfo>(messageParts.values()));
+        List<MessagePartInfo> parts = new ArrayList<MessagePartInfo>(messageParts.values());
+        parts.addAll(getOutOfBandParts());
+        return Collections.unmodifiableList(parts);
+    }
+    public List<MessagePartInfo> getOutOfBandParts() {
+        if (outOfBandParts == null) {
+            return Collections.emptyList();
+        }
+        return Collections.unmodifiableList(outOfBandParts);
     }
     
     public int size() {
-        return messageParts.size();
+        return messageParts.size() + getOutOfBandParts().size();
     }
     
 

Modified: cxf/trunk/api/src/main/java/org/apache/cxf/service/model/MessagePartInfo.java
URL: http://svn.apache.org/viewvc/cxf/trunk/api/src/main/java/org/apache/cxf/service/model/MessagePartInfo.java?rev=677385&r1=677384&r2=677385&view=diff
==============================================================================
--- cxf/trunk/api/src/main/java/org/apache/cxf/service/model/MessagePartInfo.java (original)
+++ cxf/trunk/api/src/main/java/org/apache/cxf/service/model/MessagePartInfo.java Wed Jul 16 12:23:05 2008
@@ -41,6 +41,10 @@
         mInfo = info;
         pname = n;
     }
+    
+    public void setMessageContainer(AbstractMessageContainer info) {
+        mInfo = info;
+    }
 
     /**
      * @return Returns the name.

Modified: cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapBindingFactory.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapBindingFactory.java?rev=677385&r1=677384&r2=677385&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapBindingFactory.java (original)
+++ cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapBindingFactory.java Wed Jul 16 12:23:05 2008
@@ -500,8 +500,13 @@
             if (StringUtils.isEmpty(partNameFilter)
                 || part.getName().equals(partNameFilter)) {
             
-                MessagePartInfo pi = minfo.addMessagePart(new QName(minfo.getName().getNamespaceURI(), part
-                                                                    .getName()));
+                QName pqname = new QName(minfo.getName().getNamespaceURI(), part.getName());
+                MessagePartInfo pi = minfo.addOutOfBandMessagePart(pqname);
+                
+                if (!minfo.getName().equals(msg.getQName())) {
+                    pi.setMessageContainer(new MessageInfo(minfo.getOperation(), null, msg.getQName()));
+                }
+                
                 if (part.getTypeName() != null) {
                     pi.setTypeQName(part.getTypeName());
                     pi.setElement(false);
@@ -577,8 +582,19 @@
             for (SoapHeader header : headers) {
                 SoapHeaderInfo headerInfo = new SoapHeaderInfo();
                 headerInfo.setUse(header.getUse());
-                MessagePartInfo part = msg.getMessagePart(new QName(msg.getName().getNamespaceURI(), header
-                                .getPart()));
+                MessagePartInfo part = msg.getMessagePart(new QName(msg.getName().getNamespaceURI(), 
+                                                                    header.getPart()));
+                if (part != null && header.getMessage() != null
+                    && !part.getMessageInfo().getName().equals(header.getMessage())) {
+                    part = null;
+                    //out of band, let's find it
+                    for (MessagePartInfo mpi : msg.getOutOfBandParts()) {
+                        if (mpi.getName().getLocalPart().equals(header.getPart())
+                            && mpi.getMessageInfo().getName().equals(header.getMessage())) {
+                            part = mpi;
+                        }
+                    }
+                }
                 if (part != null) {
                     headerInfo.setPart(part);
                     messageParts.remove(part);
@@ -609,54 +625,9 @@
             List<MessagePartInfo> bodyParts = new ArrayList<MessagePartInfo>();
             for (Iterator itr = parts.iterator(); itr.hasNext();) {
                 Object part = itr.next();
-                String partName = null;
                 if (part instanceof MIMEPart) {
                     MIMEPart mpart = (MIMEPart) part;
-                    if (mpart.getExtensibilityElements().size() < 1) {
-                        throw new RuntimeException("MIMEPart should at least contain one element!");
-                    }
-                    for (Object content : mpart.getExtensibilityElements()) {
-                        if (content instanceof MIMEContent) {
-                            MIMEContent mc = (MIMEContent)content;
-                            partName = mc.getPart();
-
-                            if (attParts == null) {
-                                attParts = new LinkedList<MessagePartInfo>();
-                            }
-
-                            MessagePartInfo mpi =
-                                msg.getMessagePart(new QName(msg.getName().getNamespaceURI(),
-                                                             partName));
-                            mpi.setProperty(Message.CONTENT_TYPE, mc.getType());
-                            attParts.add(mpi);
-                            // Attachments shouldn't be part of the body message
-                            bmsg.getMessageParts().remove(mpi);
-                        } else if (SOAPBindingUtil.isSOAPBody(content)) {
-                            SoapBody sb = SOAPBindingUtil.getSoapBody(content);
-                            if (sb.getParts() != null && sb.getParts().size() == 1) {
-                                partName = (String) sb.getParts().get(0);
-                            }
-
-                            // We can have a list of empty part names here.
-                            if (partName != null) {
-                                addSoapBodyPart(msg, bodyParts, partName);
-                            }
-                        } else if (SOAPBindingUtil.isSOAPHeader(content)) {
-                            SoapHeader header = SOAPBindingUtil.getSoapHeader(content);
-
-                            SoapHeaderInfo headerInfo = new SoapHeaderInfo();
-                            headerInfo.setUse(header.getUse());
-                            MessagePartInfo mpi =
-                                msg.getMessagePart(new QName(msg.getName().getNamespaceURI(), header
-                                            .getPart()));
-                            if (mpi != null) {
-                                headerInfo.setPart(mpi);
-                                messageParts.remove(part);
-                                bmsg.getMessageParts().remove(mpi);
-                                bmsg.addExtensor(headerInfo);
-                            }
-                        }
-                    }
+                    attParts = handleMimePart(mpart, attParts, msg, bmsg, bodyParts, messageParts);
                 } else {
                     addSoapBodyPart(msg, bodyParts, (String)part);
                 }
@@ -669,6 +640,75 @@
 
         bmsg.addExtensor(bodyInfo);
     }
+    
+    private List<MessagePartInfo> handleMimePart(MIMEPart mpart, 
+                                                 List<MessagePartInfo> attParts,
+                                                 MessageInfo msg,
+                                                 BindingMessageInfo bmsg,
+                                                 List<MessagePartInfo> bodyParts,
+                                                 List<MessagePartInfo> messageParts) {
+        if (mpart.getExtensibilityElements().size() < 1) {
+            throw new RuntimeException("MIMEPart should at least contain one element!");
+        }
+        String partName = null;
+        for (Object content : mpart.getExtensibilityElements()) {
+            if (content instanceof MIMEContent) {
+                MIMEContent mc = (MIMEContent)content;
+                partName = mc.getPart();
+
+                if (attParts == null) {
+                    attParts = new LinkedList<MessagePartInfo>();
+                }
+
+                MessagePartInfo mpi =
+                    msg.getMessagePart(new QName(msg.getName().getNamespaceURI(),
+                                                 partName));
+                mpi.setProperty(Message.CONTENT_TYPE, mc.getType());
+                attParts.add(mpi);
+                // Attachments shouldn't be part of the body message
+                bmsg.getMessageParts().remove(mpi);
+            } else if (SOAPBindingUtil.isSOAPBody(content)) {
+                SoapBody sb = SOAPBindingUtil.getSoapBody(content);
+                if (sb.getParts() != null && sb.getParts().size() == 1) {
+                    partName = (String) sb.getParts().get(0);
+                }
+
+                // We can have a list of empty part names here.
+                if (partName != null) {
+                    addSoapBodyPart(msg, bodyParts, partName);
+                }
+            } else if (SOAPBindingUtil.isSOAPHeader(content)) {
+                SoapHeader header = SOAPBindingUtil.getSoapHeader(content);
+
+                SoapHeaderInfo headerInfo = new SoapHeaderInfo();
+                headerInfo.setUse(header.getUse());
+                MessagePartInfo mpi =
+                    msg.getMessagePart(new QName(msg.getName().getNamespaceURI(), header
+                                .getPart()));
+                
+                if (mpi != null && header.getMessage() != null
+                    && !mpi.getMessageInfo().getName().equals(header.getMessage())) {
+                    mpi = null;
+                    //out of band, let's find it
+                    for (MessagePartInfo mpi2 : msg.getOutOfBandParts()) {
+                        if (mpi2.getName().getLocalPart().equals(header.getPart())
+                            && mpi2.getMessageInfo().getName().equals(header.getMessage())) {
+                            mpi = mpi2;
+                        }
+                    }
+                }
+
+                if (mpi != null) {
+                    headerInfo.setPart(mpi);
+                    messageParts.remove(mpart);
+                    bmsg.getMessageParts().remove(mpi);
+                    bmsg.addExtensor(headerInfo);
+                }
+            }
+        }
+        return attParts;
+    }
+    
     private void addSoapBodyPart(MessageInfo msg, List<MessagePartInfo> bodyParts, String partName) {
         MessagePartInfo mpi = msg.getMessagePart(new QName(msg.getName().getNamespaceURI(),
                                                            partName));

Modified: cxf/trunk/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/pizza_wrapped.wsdl
URL: http://svn.apache.org/viewvc/cxf/trunk/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/pizza_wrapped.wsdl?rev=677385&r1=677384&r2=677385&view=diff
==============================================================================
--- cxf/trunk/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/pizza_wrapped.wsdl (original)
+++ cxf/trunk/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/pizza_wrapped.wsdl Wed Jul 16 12:23:05 2008
@@ -73,14 +73,14 @@
     </wsdl:portType>
 
     <wsdl:message name="CallerIDHeader">
-      <wsdl:part name="callerID" element="types:CallerIDHeader"/>
+      <wsdl:part name="parameters" element="types:CallerIDHeader"/>
     </wsdl:message>
 
     <wsdl:message name="OrderPizzaRequest">
-      <wsdl:part name="body" element="types:OrderPizza"/>
+      <wsdl:part name="parameters" element="types:OrderPizza"/>
     </wsdl:message>
     <wsdl:message name="OrderPizzaResponse">
-      <wsdl:part name="body" element="types:OrderPizzaResponse"/>
+      <wsdl:part name="parameters" element="types:OrderPizzaResponse"/>
     </wsdl:message>
 
   <wsdl:binding name="PizzaPortBinding" type="tns:Pizza">
@@ -88,7 +88,7 @@
     <wsdl:operation name="OrderPizza">
       <soap:operation soapAction=""/>
       <wsdl:input>
-        <soap:header message="tns:CallerIDHeader" part="callerID" use="literal" />
+        <soap:header message="tns:CallerIDHeader" part="parameters" use="literal" />
         <soap:body use="literal"/>
       </wsdl:input>
       <wsdl:output>