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/03/13 12:18:26 UTC

svn commit: r753205 - in /cxf/trunk: rt/core/src/main/java/org/apache/cxf/catalog/ tools/common/src/main/java/org/apache/cxf/tools/common/model/ tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/customization/ tools/w...

Author: dkulp
Date: Fri Mar 13 11:18:26 2009
New Revision: 753205

URL: http://svn.apache.org/viewvc?rev=753205&view=rev
Log:
[CXF-2054] Fix problems with async method code generation

Modified:
    cxf/trunk/rt/core/src/main/java/org/apache/cxf/catalog/CatalogWSDLLocator.java
    cxf/trunk/tools/common/src/main/java/org/apache/cxf/tools/common/model/JavaParameter.java
    cxf/trunk/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/customization/CustomizationParser.java
    cxf/trunk/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/processor/internal/OperationProcessor.java
    cxf/trunk/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/processor/internal/ServiceProcessor.java
    cxf/trunk/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/hello_world_async.wsdl

Modified: cxf/trunk/rt/core/src/main/java/org/apache/cxf/catalog/CatalogWSDLLocator.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/core/src/main/java/org/apache/cxf/catalog/CatalogWSDLLocator.java?rev=753205&r1=753204&r2=753205&view=diff
==============================================================================
--- cxf/trunk/rt/core/src/main/java/org/apache/cxf/catalog/CatalogWSDLLocator.java (original)
+++ cxf/trunk/rt/core/src/main/java/org/apache/cxf/catalog/CatalogWSDLLocator.java Fri Mar 13 11:18:26 2009
@@ -56,8 +56,8 @@
     }
 
     public InputSource getBaseInputSource() {
-        InputSource result = resolver.resolve(baseUri, null);
-        if (result == null && catalogResolver != null) {
+        InputSource result = null;
+        if (catalogResolver != null) {
             try {
                 String s = catalogResolver.resolveSystem(baseUri);
                 if (s != null) {
@@ -69,6 +69,9 @@
                 //ignore
             }
         }
+        if (result == null) {
+            result = resolver.resolve(baseUri, null);
+        }
         if (wsdlUrl == null
             && result != null) {
             wsdlUrl = result.getSystemId();

Modified: cxf/trunk/tools/common/src/main/java/org/apache/cxf/tools/common/model/JavaParameter.java
URL: http://svn.apache.org/viewvc/cxf/trunk/tools/common/src/main/java/org/apache/cxf/tools/common/model/JavaParameter.java?rev=753205&r1=753204&r2=753205&view=diff
==============================================================================
--- cxf/trunk/tools/common/src/main/java/org/apache/cxf/tools/common/model/JavaParameter.java (original)
+++ cxf/trunk/tools/common/src/main/java/org/apache/cxf/tools/common/model/JavaParameter.java Fri Mar 13 11:18:26 2009
@@ -71,7 +71,9 @@
     public JAnnotation getAnnotation(String tag) {
         return annotations.get(tag);
     }
-    
+    public Collection<String> getAnnotationTags() {
+        return this.annotations.keySet();
+    }
 
     public Collection<JAnnotation> getAnnotations() {
         return this.annotations.values();

Modified: cxf/trunk/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/customization/CustomizationParser.java
URL: http://svn.apache.org/viewvc/cxf/trunk/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/customization/CustomizationParser.java?rev=753205&r1=753204&r2=753205&view=diff
==============================================================================
--- cxf/trunk/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/customization/CustomizationParser.java (original)
+++ cxf/trunk/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/customization/CustomizationParser.java Fri Mar 13 11:18:26 2009
@@ -130,6 +130,9 @@
     }
 
     public Element getTargetNode(String uri) {
+        if (uri.equals(wsdlURL) && wsdlNode != null) {
+            return wsdlNode;
+        }
         Document doc = null;
         InputStream ins = null;
 

Modified: cxf/trunk/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/processor/internal/OperationProcessor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/processor/internal/OperationProcessor.java?rev=753205&r1=753204&r2=753205&view=diff
==============================================================================
--- cxf/trunk/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/processor/internal/OperationProcessor.java (original)
+++ cxf/trunk/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/processor/internal/OperationProcessor.java Fri Mar 13 11:18:26 2009
@@ -20,7 +20,6 @@
 package org.apache.cxf.tools.wsdlto.frontend.jaxws.processor.internal;
 
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.List;
 import java.util.logging.Level;
 
@@ -178,7 +177,9 @@
     }
 
     private boolean isAsyncMethod(JavaMethod method) {
-        if (method.getName().endsWith(ToolConstants.ASYNC_METHOD_SUFFIX)) {
+        if (method.getName().endsWith(ToolConstants.ASYNC_METHOD_SUFFIX)
+            && method.getReturn() != null
+            && method.getReturn().getClassName() != null) {
             if (method.getReturn().getClassName().startsWith("Response<")) {
                 return true;
             } else if (method.getParameterCount() > 0
@@ -217,15 +218,40 @@
         callbackMethod.addAnnotation("RequestWrapper", method.getAnnotationMap().get("RequestWrapper"));
         callbackMethod.addAnnotation("SOAPBinding", method.getAnnotationMap().get("SOAPBinding"));
 
-        for (Iterator iter = method.getParameters().iterator(); iter.hasNext();) {
-            callbackMethod.addParameter((JavaParameter)iter.next());
+        boolean convertOutToAsync = !method.isWrapperStyle() 
+            && "void".equals(method.getReturn().getClassName());
+        String asyncCname = null;
+        for (JavaParameter param : method.getParameters()) {
+            if (convertOutToAsync) {
+                if (param.isHolder()) {
+                    if (param.isINOUT()) {
+                        JavaParameter p2 = new JavaParameter();
+                        
+                        p2.setName(param.getName());
+                        p2.setClassName(param.getHolderName());
+                        p2.setStyle(JavaType.Style.IN);
+                        callbackMethod.addParameter(p2);
+                        for (String s : param.getAnnotationTags()) {
+                            JAnnotation ann = param.getAnnotation(s);
+                            p2.addAnnotation(s, ann);
+                        }
+                    } else if (!param.isHeader() && asyncCname == null) {
+                        asyncCname = param.getClassName();
+                    }
+                } else {
+                    callbackMethod.addParameter(param);
+                }
+            } else {
+                callbackMethod.addParameter(param);
+            }
         }
-
         JavaParameter asyncHandler = new JavaParameter();
         
         asyncHandler.setName("asyncHandler");
         asyncHandler.setCallback(true);
-        asyncHandler.setClassName(getAsyncClassName(method, "AsyncHandler"));
+        asyncHandler.setClassName(getAsyncClassName(method, 
+                                                    "AsyncHandler",
+                                                    asyncCname));
         asyncHandler.setStyle(JavaType.Style.IN);
         
         callbackMethod.addParameter(asyncHandler);
@@ -248,8 +274,37 @@
         pollingMethod.setSoapAction(method.getSoapAction());
         pollingMethod.setOperationName(method.getOperationName());
 
+
+        boolean convertOutToAsync = !method.isWrapperStyle() 
+            && "void".equals(method.getReturn().getClassName());
+        String asyncCname = null;
+        for (JavaParameter param : method.getParameters()) {
+            if (convertOutToAsync) {
+                if (param.isHolder()) {
+                    if (param.isINOUT()) {
+                        JavaParameter p2 = new JavaParameter();
+                        
+                        p2.setName(param.getName());
+                        p2.setClassName(param.getHolderName());
+                        p2.setStyle(JavaType.Style.IN);
+                        pollingMethod.addParameter(p2);
+                        for (String s : param.getAnnotationTags()) {
+                            JAnnotation ann = param.getAnnotation(s);
+                            p2.addAnnotation(s, ann);
+                        }
+                    } else if (!param.isHeader() && asyncCname == null) {
+                        asyncCname = param.getClassName();
+                    }
+                } else {
+                    pollingMethod.addParameter(param);
+                }
+            } else {
+                pollingMethod.addParameter(param);
+            }
+        }
+
         JavaReturn response = new JavaReturn();
-        response.setClassName(getAsyncClassName(method, "Response"));
+        response.setClassName(getAsyncClassName(method, "Response", asyncCname));
         pollingMethod.setReturn(response);
 
         // REVISIT: test the operation name in the annotation
@@ -258,25 +313,22 @@
         pollingMethod.addAnnotation("ResponseWrapper", method.getAnnotationMap().get("ResponseWrapper"));
         pollingMethod.addAnnotation("SOAPBinding", method.getAnnotationMap().get("SOAPBinding"));
 
-        for (Iterator iter = method.getParameters().iterator(); iter.hasNext();) {
-            pollingMethod.addParameter((JavaParameter)iter.next());
-        }
-
         method.getInterface().addMethod(pollingMethod);
     }
 
-    private String getAsyncClassName(JavaMethod method, String clzName) {
-        String response;
-        if (wrapperResponse != null) {
-            response = wrapperResponse.getClassName();
-        } else {
-            response = method.getReturn().getClassName();
-        }
-        Class<?> mappedClass = JAXBUtils.holderClass(response);
-        if (mappedClass != null) {
-            response = mappedClass.getName();
+    private String getAsyncClassName(JavaMethod method, String clzName, String name) {
+        String response = name;
+        if (response == null) {
+            if (wrapperResponse != null) {
+                response = wrapperResponse.getClassName();
+            } else {
+                response = method.getReturn().getClassName();
+            }
+            Class<?> mappedClass = JAXBUtils.holderClass(response);
+            if (mappedClass != null) {
+                response = mappedClass.getName();
+            }
         }
-
         StringBuffer sb = new StringBuffer();
         sb.append(clzName);
         sb.append("<");

Modified: 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/cxf/trunk/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/processor/internal/ServiceProcessor.java?rev=753205&r1=753204&r2=753205&view=diff
==============================================================================
--- cxf/trunk/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/processor/internal/ServiceProcessor.java (original)
+++ cxf/trunk/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/processor/internal/ServiceProcessor.java Fri Mar 13 11:18:26 2009
@@ -454,7 +454,8 @@
                             found = true;
                         }
                     }
-                    if (jm.getReturn().getName().equals(soapHeader.getPart())) {
+                    if (jm.getReturn().getName() != null 
+                        && jm.getReturn().getName().equals(soapHeader.getPart())) {
                         found = true;
                     }
                     if (Boolean.valueOf((String)context.get(ToolConstants.CFG_EXTRA_SOAPHEADER))

Modified: cxf/trunk/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/hello_world_async.wsdl
URL: http://svn.apache.org/viewvc/cxf/trunk/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/hello_world_async.wsdl?rev=753205&r1=753204&r2=753205&view=diff
==============================================================================
--- cxf/trunk/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/hello_world_async.wsdl (original)
+++ cxf/trunk/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/hello_world_async.wsdl Fri Mar 13 11:18:26 2009
@@ -17,92 +17,164 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<wsdl:definitions 
-    xmlns="http://schemas.xmlsoap.org/wsdl/" 
-    xmlns:http-conf="http://schemas.iona.com/transports/http/configuration" 
-    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
-    xmlns:tns="http://cxf.apache.org/w2j/hello_world_async_soap_http" 
-    xmlns:x1="http://cxf.apache.org/w2j/hello_world_async_soap_http/types" 
-    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
-    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
+<wsdl:definitions
+    xmlns="http://schemas.xmlsoap.org/wsdl/"
+    xmlns:http-conf="http://schemas.iona.com/transports/http/configuration"
+    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+    xmlns:tns="http://cxf.apache.org/w2j/hello_world_async_soap_http"
+    xmlns:x1="http://cxf.apache.org/w2j/hello_world_async_soap_http/types"
+    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
-    targetNamespace="http://cxf.apache.org/w2j/hello_world_async_soap_http" 
+    targetNamespace="http://cxf.apache.org/w2j/hello_world_async_soap_http"
     name="HelloWorld">
     <jaxws:bindings>
-	<jaxws:enableAsyncMapping>true</jaxws:enableAsyncMapping>
+        <jaxws:enableAsyncMapping>true</jaxws:enableAsyncMapping>
     </jaxws:bindings>
     <wsdl:types>
-	<schema 
-	    targetNamespace="http://cxf.apache.org/w2j/hello_world_async_soap_http/types" 
-	    xmlns="http://www.w3.org/2001/XMLSchema" 
-	    xmlns:x1="http://cxf.apache.org/w2j/hello_world_async_soap_http/types" 
-	    elementFormDefault="qualified">
-	    <element name="greetMeSometime">
-		<complexType>
-		    <sequence>
-			<element name="requestType" type="xsd:string"/>
-		    </sequence>
-		</complexType>
-	    </element>
-	    <element name="greetMeSometimeResponse">
-		<complexType>
-		    <sequence>
-			<element name="responseType" type="xsd:string"/>
-		    </sequence>
-		</complexType>
-	    </element>		
-      	<element name="testInt" type="xsd:int"/>
-        <element name="testIntResponse" type="xsd:int"/>
-	</schema>
+        <schema
+            targetNamespace="http://cxf.apache.org/w2j/hello_world_async_soap_http/types"
+            xmlns="http://www.w3.org/2001/XMLSchema"
+            xmlns:x1="http://cxf.apache.org/w2j/hello_world_async_soap_http/types"
+            elementFormDefault="qualified">
+            <element name="greetMeSometime">
+                <complexType>
+                    <sequence>
+                        <element name="requestType" type="xsd:string"/>
+                    </sequence>
+                </complexType>
+            </element>
+            <element name="greetMeSometimeResponse">
+                <complexType>
+                    <sequence>
+                        <element name="responseType" type="xsd:string"/>
+                    </sequence>
+                </complexType>
+            </element>
+            <element name="greetMeWithHeader">
+                <complexType>
+                    <sequence>
+                        <element name="requestType" type="xsd:string"/>
+                    </sequence>
+                </complexType>
+            </element>
+            <element name="greetMeWithHeaderResponse">
+                <complexType>
+                    <sequence>
+                        <element name="responseType" type="xsd:string"/>
+                    </sequence>
+                </complexType>
+            </element>
+            <element name="greetMeAsync">
+                <complexType>
+                    <sequence>
+                        <element name="requestType" type="xsd:string"/>
+                    </sequence>
+                </complexType>
+            </element>
+            <element name="greetMeAsyncResponse">
+                <complexType>
+                    <sequence>
+                        <element name="responseType" type="xsd:string"/>
+                    </sequence>
+                </complexType>
+            </element>
+            <element name="header" type="xsd:int"/>
+            <element name="testInt" type="xsd:int"/>
+            <element name="testIntResponse" type="xsd:int"/>
+        </schema>
     </wsdl:types>
     <wsdl:message name="greetMeSometimeRequest">
-	<wsdl:part name="in" element="x1:greetMeSometime"/>
+        <wsdl:part name="in" element="x1:greetMeSometime"/>
     </wsdl:message>
     <wsdl:message name="greetMeSometimeResponse">
-	<wsdl:part name="out" element="x1:greetMeSometimeResponse"/>
+        <wsdl:part name="out" element="x1:greetMeSometimeResponse"/>
+    </wsdl:message>
+    <wsdl:message name="greetMeWithHeaderRequest">
+        <wsdl:part name="in" element="x1:greetMeWithHeader"/>
+    </wsdl:message>
+    <wsdl:message name="greetMeWithHeaderResponse">
+        <wsdl:part name="out" element="x1:greetMeWithHeaderResponse"/>
+        <wsdl:part name="header" element="x1:header"/>
+    </wsdl:message>
+    <wsdl:message name="HEADER">
+        <wsdl:part name="header" element="x1:header"/>
+    </wsdl:message>
+    <wsdl:message name="greetMeAsync">
+        <wsdl:part name="in" element="x1:greetMeAsync"/>
+    </wsdl:message>
+    <wsdl:message name="greetMeAsyncResponse">
+        <wsdl:part name="out" element="x1:greetMeAsyncResponse"/>
     </wsdl:message>
     <wsdl:message name="testIntRequest">
-    	<wsdl:part name="parameters" element="x1:testInt"></wsdl:part>
+        <wsdl:part name="parameters" element="x1:testInt"></wsdl:part>
     </wsdl:message>
     <wsdl:message name="testIntResponse">
-    	<wsdl:part name="parameters" element="x1:testIntResponse"></wsdl:part>
+        <wsdl:part name="parameters" element="x1:testIntResponse"></wsdl:part>
     </wsdl:message>
     <wsdl:portType name="GreeterAsync">
-	<wsdl:operation name="greetMeSometime">
-	    <wsdl:input name="greetMeSometimeRequest" message="tns:greetMeSometimeRequest"/>
-	    <wsdl:output name="greetMeSometimeResponse" message="tns:greetMeSometimeResponse"/>
-	</wsdl:operation>
-	<wsdl:operation name="testInt">
-		<wsdl:input message="tns:testIntRequest"></wsdl:input>
-		<wsdl:output message="tns:testIntResponse"></wsdl:output>
-	</wsdl:operation>
+        <wsdl:operation name="greetMeSometime">
+            <wsdl:input name="greetMeSometimeRequest" message="tns:greetMeSometimeRequest"/>
+            <wsdl:output name="greetMeSometimeResponse" message="tns:greetMeSometimeResponse"/>
+        </wsdl:operation>
+        <wsdl:operation name="testInt">
+            <wsdl:input message="tns:testIntRequest"></wsdl:input>
+            <wsdl:output message="tns:testIntResponse"></wsdl:output>
+        </wsdl:operation>
+        <wsdl:operation name="greetMeWithHeader">
+            <wsdl:input message="tns:greetMeWithHeaderRequest"></wsdl:input>
+            <wsdl:output message="tns:greetMeWithHeaderResponse"></wsdl:output>
+        </wsdl:operation>
+        <wsdl:operation name="greetMeAsync">
+            <wsdl:input message="tns:greetMeAsync"></wsdl:input>
+            <wsdl:output message="tns:greetMeAsyncResponse"></wsdl:output>
+        </wsdl:operation>
     </wsdl:portType>
     <wsdl:binding name="GreeterAsync_SOAPBinding" type="tns:GreeterAsync">
-	<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
-	<wsdl:operation name="greetMeSometime">
-	    <soap:operation style="document"/>
-	    <wsdl:input>
-		<soap:body use="literal"/>
-	    </wsdl:input>
-	    <wsdl:output>
-		<soap:body use="literal"/>
-	    </wsdl:output>
-	</wsdl:operation>
-	<wsdl:operation name="testInt">
-	    <soap:operation style="document"/>
-	    <wsdl:input>
-		<soap:body use="literal"/>
-	    </wsdl:input>
-	    <wsdl:output>
-		<soap:body use="literal"/>
-	    </wsdl:output>
-	</wsdl:operation>
+        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
+        <wsdl:operation name="greetMeSometime">
+            <soap:operation style="document"/>
+            <wsdl:input>
+                <soap:body use="literal"/>
+            </wsdl:input>
+            <wsdl:output>
+                <soap:body use="literal"/>
+            </wsdl:output>
+        </wsdl:operation>
+        <wsdl:operation name="testInt">
+            <soap:operation style="document"/>
+            <wsdl:input>
+                <soap:body use="literal"/>
+            </wsdl:input>
+            <wsdl:output>
+                <soap:body use="literal"/>
+            </wsdl:output>
+        </wsdl:operation>
+        <wsdl:operation name="greetMeWithHeader">
+            <soap:operation style="document"/>
+            <wsdl:input>
+                <soap:body use="literal" parts="in"/>
+            </wsdl:input>
+            <wsdl:output>
+                <soap:body use="literal" parts="out"/>
+                <soap:header message="tns:greetMeWithHeaderResponse" part="header" use="literal"/>
+            </wsdl:output>
+        </wsdl:operation>
+        <wsdl:operation name="greetMeAsync">
+            <soap:operation style="document"/>
+            <wsdl:input>
+                <soap:body use="literal"/>
+            </wsdl:input>
+            <wsdl:output>
+                <soap:body use="literal"/>
+            </wsdl:output>
+        </wsdl:operation>
     </wsdl:binding>
     <wsdl:service name="SOAPService">
-	<wsdl:port name="SoapPort" binding="tns:GreeterAsync_SOAPBinding">
-	    <soap:address location="http://localhost:9000/SoapContext/SoapPort"/>
-	    <http-conf:client/>
-	    <http-conf:server/>
-	</wsdl:port>
+        <wsdl:port name="SoapPort" binding="tns:GreeterAsync_SOAPBinding">
+            <soap:address location="http://localhost:9000/SoapContext/SoapPort"/>
+            <http-conf:client/>
+            <http-conf:server/>
+        </wsdl:port>
     </wsdl:service>
 </wsdl:definitions>