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 2009/12/21 21:09:25 UTC

svn commit: r892957 - in /cxf/branches/2.1.x-fixes: ./ rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapBindingFactory.java

Author: dkulp
Date: Mon Dec 21 20:09:24 2009
New Revision: 892957

URL: http://svn.apache.org/viewvc?rev=892957&view=rev
Log:
Merged revisions 892955 via svnmerge from 
https://svn.apache.org/repos/asf/cxf/branches/2.2.x-fixes

................
  r892955 | dkulp | 2009-12-21 15:08:13 -0500 (Mon, 21 Dec 2009) | 10 lines
  
  Merged revisions 892953 via svnmerge from 
  https://svn.apache.org/repos/asf/cxf/trunk
  
  ........
    r892953 | dkulp | 2009-12-21 15:05:07 -0500 (Mon, 21 Dec 2009) | 2 lines
    
    [CXF-2587] Workaround "bug" in wsdl4j that really isn't looking into
    imports like the docs say.
  ........
................

Modified:
    cxf/branches/2.1.x-fixes/   (props changed)
    cxf/branches/2.1.x-fixes/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapBindingFactory.java

Propchange: cxf/branches/2.1.x-fixes/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Dec 21 20:09:24 2009
@@ -1,2 +1,2 @@
-/cxf/branches/2.2.x-fixes:891302,891453
-/cxf/trunk:891301,891452
+/cxf/branches/2.2.x-fixes:891302,891453,892955
+/cxf/trunk:891301,891452,892953

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

Modified: cxf/branches/2.1.x-fixes/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapBindingFactory.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapBindingFactory.java?rev=892957&r1=892956&r2=892957&view=diff
==============================================================================
--- cxf/branches/2.1.x-fixes/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapBindingFactory.java (original)
+++ cxf/branches/2.1.x-fixes/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapBindingFactory.java Mon Dec 21 20:09:24 2009
@@ -27,6 +27,7 @@
 import javax.wsdl.BindingInput;
 import javax.wsdl.BindingOutput;
 import javax.wsdl.Definition;
+import javax.wsdl.Import;
 import javax.wsdl.Part;
 import javax.wsdl.WSDLException;
 import javax.wsdl.extensions.ExtensibilityElement;
@@ -61,6 +62,7 @@
 import org.apache.cxf.common.util.StringUtils;
 import org.apache.cxf.common.xmlschema.SchemaCollection;
 import org.apache.cxf.endpoint.Endpoint;
+import org.apache.cxf.helpers.CastUtils;
 import org.apache.cxf.interceptor.AttachmentInInterceptor;
 import org.apache.cxf.interceptor.AttachmentOutInterceptor;
 import org.apache.cxf.interceptor.BareOutInterceptor;
@@ -412,16 +414,52 @@
             SchemaCollection schemas = serviceInfo.getXmlSchemaCollection();
 
             if (def != null && schemas != null) {
-                javax.wsdl.Message msg = def.getMessage(header.getMessage());
+                QName qn = header.getMessage();
+                
+                javax.wsdl.Message msg = findMessage(qn, def);
                 if (msg != null) {
                     addOutOfBandParts(bop, msg, schemas, isInput, header.getPart());
                     serviceInfo.refresh();
                 } else {
                     throw new RuntimeException("Problem with WSDL: soap:header element" 
-                        + " is referring to an undefined wsdl:message element.");
+                        + " for operation " + bop.getName()
+                        + " is referring to an undefined wsdl:message element: " + qn);
+                }
+            }
+        }
+    }
+    private javax.wsdl.Message findMessage(QName qn, Definition def) {
+        javax.wsdl.Message msg = def.getMessage(qn);
+        if (msg == null) {
+            msg = findMessage(qn, def, new ArrayList<Definition>());
+        }
+        return msg;
+    }
+    private javax.wsdl.Message findMessage(QName qn, Definition def, List<Definition> done) {
+        javax.wsdl.Message msg = def.getMessage(qn);
+        if (msg == null) {
+            if (done.contains(def)) {
+                return null;
+            }
+            done.add(def);
+            Collection<List<Import>> ilist = CastUtils.cast(def.getImports().values());
+            for (List<Import> list : ilist) {
+                for (Import i : list) {
+                    if (qn.getNamespaceURI().equals(i.getDefinition().getTargetNamespace())) {
+                        return i.getDefinition().getMessage(qn);
+                    }
+                }
+            }
+            for (List<Import> list : ilist) {
+                for (Import i : list) {
+                    msg = findMessage(qn, i.getDefinition(), done);
+                    if (msg != null) {
+                        return msg;
+                    }
                 }
             }
         }
+        return msg;
     }
 
     private void addOutOfBandParts(final BindingOperationInfo bop, final javax.wsdl.Message msg,