You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by jl...@apache.org on 2007/06/07 17:44:42 UTC

svn commit: r545220 - in /incubator/cxf/trunk: api/src/main/java/org/apache/cxf/service/model/ rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/ rt/core/src/main/java/org/apache/cxf/binding/ rt/core/src/main/java/org/apache/cxf/wsdl11/ tools/...

Author: jliu
Date: Thu Jun  7 08:44:41 2007
New Revision: 545220

URL: http://svn.apache.org/viewvc?view=rev&rev=545220
Log:
CXF-602: If a type that should be passed in the SOAP header is defined in its own message rather than the request message, then CXF does not generate a parameter for that 
type in the interface.

Added:
    incubator/cxf/trunk/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/pizza.wsdl   (with props)
Modified:
    incubator/cxf/trunk/api/src/main/java/org/apache/cxf/service/model/ServiceInfo.java
    incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapBindingFactory.java
    incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/binding/AbstractBindingFactory.java
    incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/wsdl11/WSDLServiceBuilder.java
    incubator/cxf/trunk/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/processor/internal/ServiceProcessor.java
    incubator/cxf/trunk/tools/wsdlto/test/src/test/java/org/apache/cxf/tools/wsdlto/jaxws/CodeGenTest.java

Modified: incubator/cxf/trunk/api/src/main/java/org/apache/cxf/service/model/ServiceInfo.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/api/src/main/java/org/apache/cxf/service/model/ServiceInfo.java?view=diff&rev=545220&r1=545219&r2=545220
==============================================================================
--- incubator/cxf/trunk/api/src/main/java/org/apache/cxf/service/model/ServiceInfo.java (original)
+++ incubator/cxf/trunk/api/src/main/java/org/apache/cxf/service/model/ServiceInfo.java Thu Jun  7 08:44:41 2007
@@ -89,9 +89,17 @@
     }
     
     public Map<QName, MessageInfo> getMessages() {
-        if (messages != null) {
-            return messages;            
+        if (messages == null) {
+            initMessagesMap();           
         }
+        return messages;
+    }
+    
+    public MessageInfo getMessage(QName qname) {
+        return getMessages().get(qname);
+    }
+    
+    private void initMessagesMap() {
         messages = new ConcurrentHashMap<QName, MessageInfo>();
         for (OperationInfo operation : getInterface().getOperations()) {
             if (operation.getInput() != null) {
@@ -100,12 +108,18 @@
             if (operation.getOutput() != null) {
                 messages.put(operation.getOutput().getName(), operation.getOutput());
             }
-        }
-        return messages;
+        }       
     }
     
-    public MessageInfo getMessage(QName qname) {
-        return getMessages().get(qname);
+    public void setMessages(Map<QName, MessageInfo> msgs) {
+        messages = msgs;
+    }
+    
+    public void addMessage(MessageInfo msg) {
+        if (messages == null) {
+            initMessagesMap();           
+        }
+        messages.put(msg.getName(), msg);
     }
     
     public void addSchema(SchemaInfo schemaInfo) {

Modified: incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapBindingFactory.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapBindingFactory.java?view=diff&rev=545220&r1=545219&r2=545220
==============================================================================
--- incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapBindingFactory.java (original)
+++ incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapBindingFactory.java Thu Jun  7 08:44:41 2007
@@ -19,12 +19,16 @@
 
 package org.apache.cxf.binding.soap;
 
+
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
+
 import javax.wsdl.BindingInput;
 import javax.wsdl.BindingOutput;
+import javax.wsdl.Definition;
+import javax.wsdl.Part;
 import javax.wsdl.WSDLException;
 import javax.wsdl.extensions.ExtensibilityElement;
 import javax.wsdl.extensions.ExtensionRegistry;
@@ -82,7 +86,10 @@
 import org.apache.cxf.transport.MessageObserver;
 import org.apache.cxf.transport.MultipleEndpointObserver;
 import org.apache.cxf.wsdl.WSDLManager;
+import org.apache.cxf.wsdl11.WSDLServiceBuilder;
+import org.apache.ws.commons.schema.XmlSchemaCollection;
 
+import static org.apache.cxf.helpers.CastUtils.cast;
 
 public class SoapBindingFactory extends AbstractBindingFactory {
 
@@ -365,7 +372,43 @@
 
         return sb;
     }
+    
+    protected void addMessageFromBinding(ExtensibilityElement ext, ServiceInfo serviceInfo) {
+        SoapHeader header = SOAPBindingUtil.getSoapHeader(ext);
+
+        if (header != null && serviceInfo.getMessage(header.getMessage()) == null) {
+            Definition def = (Definition)serviceInfo.getProperty(WSDLServiceBuilder.WSDL_DEFINITION);
+            XmlSchemaCollection schemas = (XmlSchemaCollection)serviceInfo
+            .getProperty(WSDLServiceBuilder.WSDL_SCHEMA_LIST);
+            
+            if (def != null && schemas != null) {
+                javax.wsdl.Message msg = def.getMessage(header.getMessage());
 
+                MessageInfo minfo = new MessageInfo(null, msg.getQName());
+                buildMessage(minfo, msg, schemas);
+                
+                serviceInfo.addMessage(minfo);
+            }
+        }
+    }
+    
+    private void buildMessage(MessageInfo minfo, javax.wsdl.Message msg,
+                              XmlSchemaCollection schemas) {
+        for (Part part : cast(msg.getParts().values(), Part.class)) {
+            MessagePartInfo pi = minfo.addMessagePart(new QName(minfo.getName().getNamespaceURI(), part
+                .getName()));
+            if (part.getTypeName() != null) {
+                pi.setTypeQName(part.getTypeName());
+                pi.setElement(false);
+                pi.setXmlSchema(schemas.getTypeByQName(part.getTypeName()));
+            } else {
+                pi.setElementQName(part.getElementName());
+                pi.setElement(true);
+                pi.setXmlSchema(schemas.getElementByQName(part.getElementName()));
+            }
+        }
+    }
+   
     public BindingInfo createBindingInfo(ServiceInfo service, javax.wsdl.Binding binding, String ns) {
         SoapBindingInfo bi = new SoapBindingInfo(service, ns);
         // Copy all the extensors
@@ -373,6 +416,7 @@
     
         SoapBinding wSoapBinding
             = SOAPBindingUtil.getSoapBinding(bi.getExtensors(ExtensibilityElement.class));
+       
         
         bi.setTransportURI(wSoapBinding.getTransportURI());
         bi.setStyle(wSoapBinding.getStyle());
@@ -383,6 +427,7 @@
     
         return bi;
     }
+    
     private void initializeBindingOperation(SoapBindingInfo bi, BindingOperationInfo boi) {
         SoapOperationInfo soi = new SoapOperationInfo();
 

Modified: incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/binding/AbstractBindingFactory.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/binding/AbstractBindingFactory.java?view=diff&rev=545220&r1=545219&r2=545220
==============================================================================
--- incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/binding/AbstractBindingFactory.java (original)
+++ incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/binding/AbstractBindingFactory.java Thu Jun  7 08:44:41 2007
@@ -100,7 +100,7 @@
 
     protected BindingInfo initializeBindingInfo(ServiceInfo service, Binding binding, BindingInfo bi) {
         bi.setName(binding.getQName());
-        copyExtensors(bi, binding.getExtensibilityElements());
+        copyExtensors(bi, binding.getExtensibilityElements(), service);
 
         for (BindingOperation bop : cast(binding.getBindingOperations(), BindingOperation.class)) {
             String inName = null;
@@ -122,30 +122,36 @@
                 }
             }
             if (bop2 != null) {
-                copyExtensors(bop2, bop.getExtensibilityElements());
+                copyExtensors(bop2, bop.getExtensibilityElements(), service);
                 if (bop.getBindingInput() != null) {
-                    copyExtensors(bop2.getInput(), bop.getBindingInput().getExtensibilityElements());
+                    copyExtensors(bop2.getInput(), bop.getBindingInput().getExtensibilityElements(), service);
                 }
                 if (bop.getBindingOutput() != null) {
-                    copyExtensors(bop2.getOutput(), bop.getBindingOutput().getExtensibilityElements());
+                    copyExtensors(bop2.getOutput(), bop.getBindingOutput().getExtensibilityElements(),
+                                  service);
                 }
                 for (BindingFault f : cast(bop.getBindingFaults().values(), BindingFault.class)) {
                     copyExtensors(bop2.getFault(new QName(service.getTargetNamespace(), f.getName())),
-                                  bop.getBindingFault(f.getName()).getExtensibilityElements());
+                                  bop.getBindingFault(f.getName()).getExtensibilityElements(), service);
                 }
             }
         }
         return bi;
     }
 
-    private void copyExtensors(AbstractPropertiesHolder info, List<?> extList) {
+    private void copyExtensors(AbstractPropertiesHolder info, List<?> extList, ServiceInfo service) {
         if (info != null) {
             for (ExtensibilityElement ext : cast(extList, ExtensibilityElement.class)) {
                 info.addExtensor(ext);
+                addMessageFromBinding(ext, service);
             }
         }
     }
-
+    
+    protected void addMessageFromBinding(ExtensibilityElement ext, ServiceInfo serviceInfo) {
+        
+    }
+    
     public void addListener(Destination d, Endpoint e) {
         ChainInitiationObserver observer = new ChainInitiationObserver(e, bus);
         

Modified: incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/wsdl11/WSDLServiceBuilder.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/wsdl11/WSDLServiceBuilder.java?view=diff&rev=545220&r1=545219&r2=545220
==============================================================================
--- incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/wsdl11/WSDLServiceBuilder.java (original)
+++ incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/wsdl11/WSDLServiceBuilder.java Thu Jun  7 08:44:41 2007
@@ -241,7 +241,7 @@
                 service = new ServiceInfo();
                 service.setDescription(description);
                 description.getDescribed().add(service);
-                service.setProperty(WSDL_DEFINITION, def);
+                service.setProperty(WSDL_DEFINITION, def);               
                 service.setProperty(WSDL_SERVICE, serv);
 
                 XmlSchemaCollection schemas = getSchemas(def, service);

Modified: incubator/cxf/trunk/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/processor/internal/ServiceProcessor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/processor/internal/ServiceProcessor.java?view=diff&rev=545220&r1=545219&r2=545220
==============================================================================
--- incubator/cxf/trunk/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/processor/internal/ServiceProcessor.java (original)
+++ incubator/cxf/trunk/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/processor/internal/ServiceProcessor.java Thu Jun  7 08:44:41 2007
@@ -485,6 +485,7 @@
             // different message
             // other than messages used in porttype operation
             ParameterProcessor processor = new ParameterProcessor(context);
+           
             MessagePartInfo exPart = service.getMessage(soapHeader.getMessage())
                 .getMessagePart(new QName(soapHeader.getMessage().getNamespaceURI(),
                                           soapHeader.getPart()));

Modified: incubator/cxf/trunk/tools/wsdlto/test/src/test/java/org/apache/cxf/tools/wsdlto/jaxws/CodeGenTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/tools/wsdlto/test/src/test/java/org/apache/cxf/tools/wsdlto/jaxws/CodeGenTest.java?view=diff&rev=545220&r1=545219&r2=545220
==============================================================================
--- incubator/cxf/trunk/tools/wsdlto/test/src/test/java/org/apache/cxf/tools/wsdlto/jaxws/CodeGenTest.java (original)
+++ incubator/cxf/trunk/tools/wsdlto/test/src/test/java/org/apache/cxf/tools/wsdlto/jaxws/CodeGenTest.java Thu Jun  7 08:44:41 2007
@@ -78,7 +78,68 @@
         processor = null;
         env = null;
     }
+    
+    @Test
+    public void testHeaderFromAnotherNamespace() throws Exception {
 
+        env.put(ToolConstants.CFG_WSDLURL, getLocation("/wsdl2java_wsdl/pizza.wsdl"));
+        env.put(ToolConstants.CFG_EXTRA_SOAPHEADER, "TRUE");
+        processor.setContext(env);
+        processor.execute();
+
+        assertNotNull(output);
+
+        Class clz = classLoader.loadClass("com.mypizzaco.pizza.PizzaPortType");      
+        
+        Method meths[] = clz.getMethods();
+        for (Method m : meths) {
+            if ("orderPizzaBroken".equals(m.getName())) {
+                Annotation annotations[][] = m.getParameterAnnotations();
+                assertEquals(2, annotations.length);
+                for (int i = 0; i < 2; i++) {
+                    assertTrue(annotations[i][0] instanceof WebParam);
+                    WebParam parm = (WebParam)annotations[i][0];
+                    if ("OrderPizza".equals(parm.name())) {
+                        assertEquals("http://mypizzaco.com/pizza/types", parm.targetNamespace());
+                        assertEquals("OrderPizza", parm.name());
+                        assertTrue(!parm.header());                       
+                    } else if ("CallerIDHeader".equals(parm.name())) {
+                        assertEquals("http://mypizzaco.com/pizza/types", parm.targetNamespace());
+                        assertEquals("callerID", parm.partName());
+                        assertEquals("CallerIDHeader", parm.name());
+                        assertTrue(parm.header());                       
+                    } else {
+                        fail("No WebParam found!");
+                    }
+                }
+           
+            }
+            if ("orderPizza".equals(m.getName())) {
+                Annotation annotations[][] = m.getParameterAnnotations();
+                assertEquals(2, annotations.length);
+                for (int i = 0; i < 2; i++) {
+                    assertTrue(annotations[i][0] instanceof WebParam);
+                    WebParam parm = (WebParam)annotations[i][0];
+                    if ("OrderPizza".equals(parm.name())) {
+                        assertEquals("http://mypizzaco.com/pizza/types", parm.targetNamespace());
+                        assertEquals("OrderPizza", parm.name());
+                        assertTrue(!parm.header());                       
+                    } else if ("CallerIDHeader".equals(parm.name())) {
+                        assertEquals("http://mypizzaco.com/pizza/types", parm.targetNamespace());
+                        assertEquals("callerID", parm.partName());
+                        assertEquals("CallerIDHeader", parm.name());
+                        assertTrue(parm.header());                       
+                    } else {
+                        fail("No WebParam found!");
+                    }
+                }
+           
+            } 
+        }
+
+
+    }
+    
     @Test
     public void testRPCLit() throws Exception {
 

Added: incubator/cxf/trunk/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/pizza.wsdl
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/pizza.wsdl?view=auto&rev=545220
==============================================================================
--- incubator/cxf/trunk/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/pizza.wsdl (added)
+++ incubator/cxf/trunk/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/pizza.wsdl Thu Jun  7 08:44:41 2007
@@ -0,0 +1,109 @@
+<?xml version="1.0" ?>
+<wsdl:definitions 
+        name="PizzaService"
+        targetNamespace="http://mypizzaco.com/pizza"
+        xmlns:tns="http://mypizzaco.com/pizza"
+        xmlns:types="http://mypizzaco.com/pizza/types"
+        xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
+            
+  <wsdl:types>
+    <xsd:schema targetNamespace="http://mypizzaco.com/pizza/types"
+               xmlns:tns="http://mypizzaco.com/pizza/types"
+			   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+			   elementFormDefault="qualified"
+			   version="1.0">
+
+      <xsd:element name="CallerIDHeader" type="tns:CallerIDHeaderType" />
+	  
+      <xsd:complexType name="CallerIDHeaderType">
+        <xsd:sequence>
+          <xsd:element name="Name" type="xsd:string" />
+          <xsd:element name="PhoneNumber" type="xsd:string" />
+        </xsd:sequence>
+      </xsd:complexType>
+      
+	  <xsd:element name="OrderPizza" type="tns:OrderPizzaType" />
+	  
+      <xsd:complexType name="OrderPizzaType">
+        <xsd:sequence>
+          <xsd:element name="Toppings" type="tns:ToppingsListType" />
+        </xsd:sequence>
+      </xsd:complexType>
+	  
+      <xsd:element name="OrderPizzaResponse" type="tns:OrderPizzaResponseType" />
+
+      <xsd:complexType name="OrderPizzaResponseType">
+        <xsd:sequence>
+          <xsd:element name="MinutesUntilReady" type="xsd:int" /> 
+        </xsd:sequence>
+      </xsd:complexType>
+
+      <xsd:complexType name="ToppingsListType">
+        <xsd:sequence>
+          <xsd:element name="Topping" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
+        </xsd:sequence>
+      </xsd:complexType>
+
+    </xsd:schema>
+  </wsdl:types>
+
+  <wsdl:message name="CallerIDHeader">
+    <wsdl:part name="callerID" element="types:CallerIDHeader"/>
+  </wsdl:message>	
+  <wsdl:message name="OrderPizzaBrokenRequest">
+    <wsdl:part name="body" element="types:OrderPizza"/>
+  </wsdl:message>	
+  <wsdl:message name="OrderPizzaBrokenResponse">
+    <wsdl:part name="body" element="types:OrderPizzaResponse"/>
+  </wsdl:message>
+  <wsdl:message name="OrderPizzaRequest">
+    <wsdl:part name="body" element="types:OrderPizza"/>
+    <wsdl:part name="callerID" element="types:CallerIDHeader"/>
+  </wsdl:message>	
+  <wsdl:message name="OrderPizzaResponse">
+    <wsdl:part name="body" element="types:OrderPizzaResponse"/>
+  </wsdl:message>
+  	
+  <wsdl:portType name="PizzaPortType">
+    <wsdl:operation name="OrderPizzaBroken">
+      <wsdl:input message="tns:OrderPizzaBrokenRequest" />
+      <wsdl:output message="tns:OrderPizzaBrokenResponse" />
+    </wsdl:operation>
+    <wsdl:operation name="OrderPizza">
+      <wsdl:input message="tns:OrderPizzaRequest" />
+      <wsdl:output message="tns:OrderPizzaResponse" />
+    </wsdl:operation>
+  </wsdl:portType>
+  
+  <wsdl:binding name="PizzaPortBinding" type="tns:PizzaPortType">
+    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
+    <wsdl:operation name="OrderPizzaBroken">
+      <soap:operation soapAction=""/>
+      <wsdl:input>
+        <soap:header message="tns:CallerIDHeader" part="callerID" use="literal" />
+        <soap:body use="literal"/>
+      </wsdl:input>
+      <wsdl:output>
+        <soap:body use="literal"/>
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="OrderPizza">
+      <soap:operation soapAction=""/>
+      <wsdl:input>
+        <soap:header message="tns:OrderPizzaRequest" part="callerID" use="literal" />
+        <soap:body use="literal"/>
+      </wsdl:input>
+      <wsdl:output>
+        <soap:body use="literal"/>
+      </wsdl:output>
+    </wsdl:operation>
+  </wsdl:binding>
+  
+  <wsdl:service name="PizzaService">
+    <wsdl:port name="PizzaPort" binding="tns:PizzaPortBinding">
+      <soap:address location="http://localhost:8080/pizza_service/services/PizzaService"/>
+    </wsdl:port>
+  </wsdl:service>
+
+</wsdl:definitions>
\ No newline at end of file

Propchange: incubator/cxf/trunk/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/pizza.wsdl
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/cxf/trunk/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/pizza.wsdl
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: incubator/cxf/trunk/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/pizza.wsdl
------------------------------------------------------------------------------
    svn:mime-type = text/xml