Author: dkulp
Date: Mon Apr 21 20:29:21 2008
New Revision: 650368

URL: http://svn.apache.org/viewvc?rev=650368&view=rev
Log:
[CXF-1537] Bunch of issues with out-of-band headers

Added:
    
incubator/cxf/trunk/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/OutOfBandHeaderBug.wsdl
   (with props)
Modified:
    
incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapBindingFactory.java
    
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/HolderInInterceptor.java
    
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/HolderOutInterceptor.java
    
incubator/cxf/trunk/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/processor/internal/ParameterProcessor.java
    
incubator/cxf/trunk/tools/wsdlto/test/src/test/java/org/apache/cxf/tools/wsdlto/jaxws/CodeGenTest.java

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?rev=650368&r1=650367&r2=650368&view=diff
==============================================================================
--- 
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
 Mon Apr 21 20:29:21 2008
@@ -417,6 +417,24 @@
         MessageInfo minfo = null;
         MessageInfo.Type type;
 
+        int nextId = 0;
+        minfo = bop.getOperationInfo().getInput();
+        if (minfo != null) {
+            for (MessagePartInfo part : minfo.getMessageParts()) {
+                if (part.getIndex() >= nextId) {
+                    nextId = part.getIndex() + 1;
+                }
+            }
+        }
+        minfo = bop.getOperationInfo().getOutput();
+        if (minfo != null) {
+            for (MessagePartInfo part : minfo.getMessageParts()) {
+                if (part.getIndex() >= nextId) {
+                    nextId = part.getIndex() + 1;
+                }
+            }
+        }
+        
         if (isInput) {
             type = MessageInfo.Type.INPUT;
             minfo = bop.getOperationInfo().getInput();
@@ -428,7 +446,7 @@
         if (minfo == null) {
             minfo = new MessageInfo(null, type, msg.getQName());
         }
-        buildMessage(minfo, msg, schemas);
+        buildMessage(minfo, msg, schemas, nextId);
 
         // for wrapped style
         OperationInfo unwrapped = 
bop.getOperationInfo().getUnwrappedOperation();
@@ -436,6 +454,26 @@
             return;
         }
         
+        nextId = 0;
+        minfo = unwrapped.getInput();
+        if (minfo != null) {
+            for (MessagePartInfo part : minfo.getMessageParts()) {
+                if (part.getIndex() >= nextId) {
+                    nextId = part.getIndex() + 1;
+                }
+            }
+        }
+        minfo = unwrapped.getOutput();
+        if (minfo != null) {
+            for (MessagePartInfo part : minfo.getMessageParts()) {
+                if (part.getIndex() >= nextId) {
+                    nextId = part.getIndex() + 1;
+                }
+            }
+        }
+        
+        
+        
         if (isInput) {
             minfo = unwrapped.getInput();
             type = MessageInfo.Type.INPUT;
@@ -447,11 +485,13 @@
         if (minfo == null) {
             minfo = new MessageInfo(unwrapped, type, msg.getQName());
         }
-        buildMessage(minfo, msg, schemas);
+        buildMessage(minfo, msg, schemas, nextId);
     }
 
-    private void buildMessage(MessageInfo minfo, javax.wsdl.Message msg,
-                              SchemaCollection schemas) {
+    private void buildMessage(MessageInfo minfo,
+                              javax.wsdl.Message msg,
+                              SchemaCollection schemas,
+                              int nextId) {
         for (Part part : cast(msg.getParts().values(), Part.class)) {
             MessagePartInfo pi = minfo.addMessagePart(new 
QName(minfo.getName().getNamespaceURI(), part
                                                                 .getName()));
@@ -466,6 +506,8 @@
             }
             pi.setProperty(OUT_OF_BAND_HEADER, Boolean.TRUE);
             pi.setProperty(HEADER, Boolean.TRUE);
+            pi.setIndex(nextId);
+            nextId++;
         }
     }
 

Modified: 
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/HolderInInterceptor.java
URL: 
http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/HolderInInterceptor.java?rev=650368&r1=650367&r2=650368&view=diff
==============================================================================
--- 
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/HolderInInterceptor.java
 (original)
+++ 
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/HolderInInterceptor.java
 Mon Apr 21 20:29:21 2008
@@ -59,7 +59,7 @@
             List<Holder> outHolders = 
CastUtils.cast((List)message.getExchange()
                 .getOutMessage().get(CLIENT_HOLDERS));
             for (MessagePartInfo part : parts) {
-                if (part.getIndex() != 0) {
+                if (part.getIndex() != 0 && part.getTypeClass() != null) {
                     Holder holder = (Holder)outHolders.get(part.getIndex() - 
1);
                     holder.value = inObjects.get(part);
                     inObjects.put(part, holder);
@@ -68,7 +68,7 @@
         } else {
             for (MessagePartInfo part : parts) {
                 int idx = part.getIndex() - 1;
-                if (idx >= 0) {
+                if (idx >= 0 && part.getTypeClass() != null) {
                     if (idx >= inObjects.size()) {
                         inObjects.set(idx, new Holder<Object>());
                     } else {

Modified: 
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/HolderOutInterceptor.java
URL: 
http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/HolderOutInterceptor.java?rev=650368&r1=650367&r2=650368&view=diff
==============================================================================
--- 
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/HolderOutInterceptor.java
 (original)
+++ 
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/HolderOutInterceptor.java
 Mon Apr 21 20:29:21 2008
@@ -78,7 +78,7 @@
                 }
             }
             for (MessagePartInfo part : parts) {
-                if (part.getIndex() > 0) {
+                if (part.getIndex() > 0 && part.getTypeClass() != null) {
                     Holder holder = (Holder)outObjects.get(part);
                     outObjects.put(part, holder.value);
                 }

Modified: 
incubator/cxf/trunk/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/processor/internal/ParameterProcessor.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/ParameterProcessor.java?rev=650368&r1=650367&r2=650368&view=diff
==============================================================================
--- 
incubator/cxf/trunk/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/processor/internal/ParameterProcessor.java
 (original)
+++ 
incubator/cxf/trunk/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/processor/internal/ParameterProcessor.java
 Mon Apr 21 20:29:21 2008
@@ -231,40 +231,50 @@
             outputMessage == null ? new ArrayList<MessagePartInfo>() : 
outputMessage.getMessageParts();
         // figure out output parts that are not present in input parts
         List<MessagePartInfo> outParts = new ArrayList<MessagePartInfo>();
+        int numHeader = 0;
         if (isRequestResponse(method)) {
-
             for (MessagePartInfo outpart : outputParts) {
-                if (isOutOfBandHeader(outpart) && !requireOutOfBandHeader()) {
-                    continue;
+                boolean oob = false;
+                if (isOutOfBandHeader(outpart)) {
+                    if (!requireOutOfBandHeader()) {
+                        continue;
+                    }
+                    oob = true;
                 }
                 
                 MessagePartInfo inpart = inputPartsMap.get(outpart.getName());
                 if (inpart == null) {
                     outParts.add(outpart);
+                    if (oob) {
+                        numHeader++;
+                    }
                     continue;
                 } else if (isSamePart(inpart, outpart)) {
                     addParameter(method, getParameterFromPart(method, outpart, 
JavaType.Style.INOUT));
                     continue;
                 } else if (!isSamePart(inpart, outpart)) {
+                    if (oob) {
+                        numHeader++;
+                    }
                     outParts.add(outpart);
                     continue;
                 }
             }
         }
 
-        if (isRequestResponse(method) && outParts.size() == 1) {
-            processReturn(method, outParts.get(0));
-            return;
-        } else {
-            processReturn(method, null);
-        }
         if (isRequestResponse(method)) {
+            if (outParts.size() - numHeader == 1
+                && !isHeader(outParts.get(0))) {
+                processReturn(method, outParts.get(0));
+                outParts.remove(0);
+            } else {
+                processReturn(method, null);
+            }
             for (MessagePartInfo part : outParts) {
-                if (isOutOfBandHeader(part) && !requireOutOfBandHeader()) {
-                    continue;
-                }
                 addParameter(method, getParameterFromPart(method, part, 
JavaType.Style.OUT));
             }
+        } else {
+            processReturn(method, null);
         }
     }
 

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?rev=650368&r1=650367&r2=650368&view=diff
==============================================================================
--- 
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
 Mon Apr 21 20:29:21 2008
@@ -211,6 +211,7 @@
     }
 
 
+
     @Test
     public void testHeaderFromAnotherMessage4() throws Exception {
         env.put(ToolConstants.CFG_WSDLURL, 
getLocation("/wsdl2java_wsdl/pizza_wrapped.wsdl"));
@@ -240,6 +241,26 @@
                         fail("No WebParam found!");
                     }
                 }
+            }
+        }
+    }
+
+    @Test
+    public void testHeaderFromAnotherMessage5() throws Exception {
+        env.put(ToolConstants.CFG_WSDLURL, 
getLocation("/wsdl2java_wsdl/OutOfBandHeaderBug.wsdl"));
+        env.put(ToolConstants.CFG_EXTRA_SOAPHEADER, "TRUE");
+        processor.setContext(env);
+        processor.execute();
+
+        assertNotNull(output);
+
+        Class clz = 
classLoader.loadClass("org.apache.cxf.bugs.oobh.LoginInterface");
+        Method meths[] = clz.getMethods();
+        for (Method m : meths) {
+            if ("login".equals(m.getName())) {
+                assertEquals(String.class, m.getReturnType());
+                assertEquals(2, m.getParameterTypes().length);
+                assertEquals(Holder.class, m.getParameterTypes()[1]);
             }
         }
     }

Added: 
incubator/cxf/trunk/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/OutOfBandHeaderBug.wsdl
URL: 
http://svn.apache.org/viewvc/incubator/cxf/trunk/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/OutOfBandHeaderBug.wsdl?rev=650368&view=auto
==============================================================================
--- 
incubator/cxf/trunk/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/OutOfBandHeaderBug.wsdl
 (added)
+++ 
incubator/cxf/trunk/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/OutOfBandHeaderBug.wsdl
 Mon Apr 21 20:29:21 2008
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<wsdl:definitions targetNamespace="http://cxf.apache.org/bugs/oobh"; 
xmlns="http://schemas.xmlsoap.org/wsdl/"; 
xmlns:apachesoap="http://xml.apache.org/xml-soap"; 
xmlns:impl="http://cxf.apache.org/bugs/oobh"; 
xmlns:intf="http://cxf.apache.org/bugs/oobh"; 
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"; 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"; 
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"; 
xmlns:xsd="http://www.w3.org/2001/XMLSchema";>
+    <wsdl:types>
+
+        <schema targetNamespace="http://cxf.apache.org/bugs/oobh"; 
xmlns="http://www.w3.org/2001/XMLSchema";>
+            <!--  type defined for soap header  -->
+            <complexType name="SessionHeader">
+                <sequence>
+                    <element name="SessionId" type="xsd:string"/>
+                </sequence>
+            </complexType>
+            <element name="SessionHeader" type="impl:SessionHeader"/>
+
+            <!--  elements for Login operation messages  -->
+            <complexType name="LoginRequest">
+                <sequence>
+                    <element name="UserName" type="xsd:string"/>
+                    <element name="Password" type="xsd:string"/>
+                </sequence>
+            </complexType>
+            <element name="Login" type="impl:LoginRequest"/>
+            <element name="LoginReturn" type="xsd:string"/>
+        </schema>
+    </wsdl:types>
+    <wsdl:message name="SessionHeader">
+        <wsdl:part name="SessionHeader" element="impl:SessionHeader"/>
+    </wsdl:message>
+    <wsdl:message name="LoginRequest">
+        <wsdl:part name="param" element="impl:Login"/>
+    </wsdl:message>
+    <wsdl:message name="LoginResponse">
+        <wsdl:part name="param" element="impl:LoginReturn"/>
+    </wsdl:message>
+
+    <wsdl:portType name="LoginInterface">
+        <wsdl:operation name="Login">
+            <wsdl:input name="LoginRequest" message="impl:LoginRequest"/>
+            <wsdl:output name="LoginResponse" message="impl:LoginResponse"/>
+        </wsdl:operation>
+    </wsdl:portType>
+    <wsdl:binding name="LoginServiceSoapBinding" type="impl:LoginInterface">
+        <wsdlsoap:binding style="document" 
transport="http://schemas.xmlsoap.org/soap/http"/>
+        <wsdl:operation name="Login">
+            <wsdlsoap:operation soapAction=""/>
+            <wsdl:input>
+                <wsdlsoap:body use="literal"/>
+            </wsdl:input>
+            <wsdl:output>
+                <wsdlsoap:header message="impl:SessionHeader" 
part="SessionHeader" use="literal"/>
+                <wsdlsoap:body use="literal"/>
+            </wsdl:output>
+        </wsdl:operation>
+    </wsdl:binding>
+
+    <wsdl:service name="LoginService">
+        <wsdl:port name="Login" binding="impl:LoginServiceSoapBinding">
+            <wsdlsoap:address location="http://localhost:9999/Login"/>
+        </wsdl:port>
+    </wsdl:service  >
+</wsdl:definitions>
+

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

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

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


Reply via email to