This is an automated email from the ASF dual-hosted git repository.

coheigea pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cxf.git


The following commit(s) were added to refs/heads/master by this push:
     new ef41e00  [CXF-8025]: Fix Wrapper Style for multilevel xsd:extension 
elements
     new ab708ae  Merge pull request #543 from jpoje-gtri/CXF-8025
ef41e00 is described below

commit ef41e00f34c0c42987acf34543055fee5f84bd68
Author: jpoje-gtri <49731216+jpoje-g...@users.noreply.github.com>
AuthorDate: Wed Apr 17 16:46:57 2019 -0400

    [CXF-8025]: Fix Wrapper Style for multilevel xsd:extension elements
    
    Original support was added in [CXF-2193].  This allows for multiple
    levels of xsd:extension in elements while still using wrapper style.
---
 .../jaxws/processor/internal/ProcessorUtil.java    | 52 +++++++-----
 .../apache/cxf/tools/wsdlto/jaxws/CodeGenTest.java | 21 +++++
 .../hello_world_multilevel_extension_wrapped.wsdl  | 96 ++++++++++++++++++++++
 3 files changed, 149 insertions(+), 20 deletions(-)

diff --git 
a/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/processor/internal/ProcessorUtil.java
 
b/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/processor/internal/ProcessorUtil.java
index 878d2ec..3c5a174 100644
--- 
a/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/processor/internal/ProcessorUtil.java
+++ 
b/tools/wsdlto/frontend/jaxws/src/main/java/org/apache/cxf/tools/wsdlto/frontend/jaxws/processor/internal/ProcessorUtil.java
@@ -357,8 +357,6 @@ public final class ProcessorUtil {
     }
 
     public static List<WrapperElement> getWrappedElement(ToolContext context, 
QName partElement) {
-        List<WrapperElement> qnames = new ArrayList<>();
-
         ServiceInfo serviceInfo = context.get(ServiceInfo.class);
         SchemaCollection schema = serviceInfo.getXmlSchemaCollection();
 
@@ -368,32 +366,46 @@ public final class ProcessorUtil {
 
         XmlSchemaSequence seq = (XmlSchemaSequence)type.getParticle();
 
-        qnames.addAll(createWrappedElements(seq));
+        List<WrapperElement> qnames = createWrappedElements(seq);
 
         //If it's extension
         if (seq == null && type.getContentModel() != null) {
+            qnames.addAll(createWrappedElementsFromExtension(schema, type));
+        }
 
-            XmlSchemaContent xmlSchemaConent = 
type.getContentModel().getContent();
-            if (xmlSchemaConent instanceof XmlSchemaComplexContentExtension) {
-                XmlSchemaComplexContentExtension extension = 
(XmlSchemaComplexContentExtension)type
-                    .getContentModel().getContent();
-                QName baseTypeName = extension.getBaseTypeName();
-                XmlSchemaType schemaType = schema.getTypeByQName(baseTypeName);
-                if (schemaType instanceof XmlSchemaComplexType) {
-                    XmlSchemaComplexType complexType = 
(XmlSchemaComplexType)schemaType;
-                    if (complexType.getParticle() instanceof 
XmlSchemaSequence) {
-                        seq = (XmlSchemaSequence)complexType.getParticle();
-                        qnames.addAll(createWrappedElements(seq));
-                    }
-                }
+        return qnames;
+    }
 
-                if (extension.getParticle() instanceof XmlSchemaSequence) {
-                    XmlSchemaSequence xmlSchemaSeq = 
(XmlSchemaSequence)extension.getParticle();
-                    qnames.addAll(createWrappedElements(xmlSchemaSeq));
-                }
+    private static List<WrapperElement> 
createWrappedElementsFromExtension(SchemaCollection schema,
+                                                                           
XmlSchemaComplexType type) {
+        List<WrapperElement> qnames = new ArrayList<>();
+
+        XmlSchemaContent schemaContent = type.getContentModel().getContent();
+        if (!(schemaContent instanceof XmlSchemaComplexContentExtension)) {
+            return qnames;
+        }
+
+        XmlSchemaComplexContentExtension extension = 
(XmlSchemaComplexContentExtension)schemaContent;
+        QName baseTypeName = extension.getBaseTypeName();
+        XmlSchemaType baseType = schema.getTypeByQName(baseTypeName);
+
+        if (baseType instanceof XmlSchemaComplexType) {
+            XmlSchemaComplexType complexBaseType = 
(XmlSchemaComplexType)baseType;
+
+            if (complexBaseType.getParticle() == null && 
complexBaseType.getContentModel() != null) {
+                // continue up the extension ladder
+                qnames.addAll(createWrappedElementsFromExtension(schema, 
complexBaseType));
+            } else if (complexBaseType.getParticle() instanceof 
XmlSchemaSequence) {
+                XmlSchemaSequence seq = 
(XmlSchemaSequence)complexBaseType.getParticle();
+                qnames.addAll(createWrappedElements(seq));
             }
+        }
 
+        if (extension.getParticle() instanceof XmlSchemaSequence) {
+            XmlSchemaSequence xmlSchemaSeq = 
(XmlSchemaSequence)extension.getParticle();
+            qnames.addAll(createWrappedElements(xmlSchemaSeq));
         }
+
         return qnames;
     }
 
diff --git 
a/tools/wsdlto/test/src/test/java/org/apache/cxf/tools/wsdlto/jaxws/CodeGenTest.java
 
b/tools/wsdlto/test/src/test/java/org/apache/cxf/tools/wsdlto/jaxws/CodeGenTest.java
index bca57cc..89e2c1e 100644
--- 
a/tools/wsdlto/test/src/test/java/org/apache/cxf/tools/wsdlto/jaxws/CodeGenTest.java
+++ 
b/tools/wsdlto/test/src/test/java/org/apache/cxf/tools/wsdlto/jaxws/CodeGenTest.java
@@ -1645,6 +1645,27 @@ public class CodeGenTest extends AbstractCodeGenTest {
         RequestWrapper reqWrapper = method.getAnnotation(RequestWrapper.class);
         assertNotNull("@RequestWrapper is expected", reqWrapper);
     }
+
+    @Test
+    public void testMultilevelExtensionWrapper() throws Exception {
+        env.put(ToolConstants.CFG_WSDLURL,
+                
getLocation("/wsdl2java_wsdl/cxf8025/hello_world_multilevel_extension_wrapped.wsdl"));
+        processor.setContext(env);
+        processor.execute();
+
+        File infFile = new File(output, 
"org/apache/cxf/w2j/multilevel_extension_wrapped/Greeter.java");
+        assertTrue(infFile.exists());
+
+        Class<?> interfaceClass = 
classLoader.loadClass("org.apache.cxf.w2j.multilevel_extension_wrapped.Greeter");
+
+        Method method = interfaceClass.getMethod("greetMeMultilevelExtension", 
new Class[] {
+            String.class, String.class, String.class, String.class
+        });
+        assertNotNull("greetMeMultilevelExtension operation is NOT generated 
correctly as excepted", method);
+        RequestWrapper reqWrapper = method.getAnnotation(RequestWrapper.class);
+        assertNotNull("@RequestWrapper is expected on 
greetMeMultilevelExtension", reqWrapper);
+    }
+
     @Test
     public void testJavaDoc() throws Exception {
         env.put(ToolConstants.CFG_WSDLURL, 
getLocation("/wsdl2java_wsdl/hello_world.wsdl"));
diff --git 
a/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/cxf8025/hello_world_multilevel_extension_wrapped.wsdl
 
b/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/cxf8025/hello_world_multilevel_extension_wrapped.wsdl
new file mode 100644
index 0000000..28b775d
--- /dev/null
+++ 
b/tools/wsdlto/test/src/test/resources/wsdl2java_wsdl/cxf8025/hello_world_multilevel_extension_wrapped.wsdl
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Licensed to the Apache Software Foundation (ASF) under one or more 
contributor 
+        license agreements. See the NOTICE file distributed with this work for 
additional 
+        information regarding copyright ownership. The ASF licenses this file 
to 
+        you under the Apache License, Version 2.0 (the "License"); you may not 
use 
+        this file except in compliance with the License. You may obtain a copy 
of 
+        the License at http://www.apache.org/licenses/LICENSE-2.0 Unless 
required 
+        by applicable law or agreed to in writing, software distributed under 
the 
+        License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 
CONDITIONS 
+        OF ANY KIND, either express or implied. See the License for the 
specific 
+        language governing permissions and limitations under the License. -->
+<wsdl:definitions xmlns="http://schemas.xmlsoap.org/wsdl/"; 
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"; 
xmlns:tns="http://cxf.apache.org/w2j/multilevel_extension_wrapped"; 
xmlns:x1="http://cxf.apache.org/w2j/multilevel_extension_wrapped/types"; 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"; 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"; 
targetNamespace="http://cxf.apache.org/w2j/multilevel_extension_wrapped"; 
name="HelloWorld">
+    <wsdl:types>
+        <schema xmlns="http://www.w3.org/2001/XMLSchema"; 
xmlns:x1="http://cxf.apache.org/w2j/multilevel_extension_wrapped/types"; 
targetNamespace="http://cxf.apache.org/w2j/multilevel_extension_wrapped/types"; 
elementFormDefault="qualified">
+            <!-- request has multiple extension levels, some with elements and 
some with nothing -->
+            <element name="greetMeMultilevelExtension" type="x1:greetMeType"/>
+            <complexType name="greetMeType">
+                <complexContent>
+                    <extension base="x1:EmptyComplexContextParentType">
+                        <sequence>
+                            <element name="id" type="xsd:string" minOccurs="1" 
maxOccurs="1"/>
+                            <element name="name" type="xsd:string" 
minOccurs="1" maxOccurs="1"/>
+                        </sequence>
+                    </extension>
+                </complexContent>
+            </complexType>
+            <complexType name="EmptyComplexContextParentType">
+                <complexContent>
+                    <extension base="x1:ComplexContextParentType"/>
+                </complexContent>
+            </complexType>
+            <complexType name="ComplexContextParentType">
+                <complexContent>
+                    <extension base="x1:EmptyComplexContextGrandParentType1">
+                        <sequence>
+                            <element name="parentId" type="xsd:string" 
minOccurs="1" maxOccurs="1"/>
+                        </sequence>
+                    </extension>
+                </complexContent>
+            </complexType>
+            <complexType name="EmptyComplexContextGrandParentType1">
+                <complexContent>
+                    <extension base="x1:EmptyComplexContextGrandParentType2"/>
+                </complexContent>
+            </complexType>
+            <complexType name="EmptyComplexContextGrandParentType2">
+                <complexContent>
+                    <extension base="x1:ComplexContextGreatGrandParentType"/>
+                </complexContent>
+            </complexType>
+            <complexType name="ComplexContextGreatGrandParentType">
+                <sequence>
+                    <element name="greatGrandParentId" type="xsd:string" 
minOccurs="1" maxOccurs="1"/>
+                </sequence>
+            </complexType>
+
+            <!-- basic response -->
+            <element name="greetMeResponse" type="x1:greetMeResponseType"/>
+            <complexType name="greetMeResponseType">
+                <sequence>
+                    <element name="responseValue" type="xsd:string" 
minOccurs="1" maxOccurs="1"/>
+                </sequence>
+            </complexType>
+        </schema>
+    </wsdl:types>
+    <wsdl:message name="greetMeRequest">
+        <wsdl:part name="in" element="x1:greetMeMultilevelExtension"/>
+    </wsdl:message>
+    <wsdl:message name="greetMeResponse">
+        <wsdl:part name="out" element="x1:greetMeResponse"/>
+    </wsdl:message>
+    <wsdl:portType name="Greeter">
+        <wsdl:operation name="greetMeMultilevelExtension">
+            <wsdl:input name="greetMeRequest" message="tns:greetMeRequest"/>
+            <wsdl:output name="greetMeResponse" message="tns:greetMeResponse"/>
+        </wsdl:operation>
+    </wsdl:portType>
+    <wsdl:binding name="Greeter_SOAPBinding" type="tns:Greeter">
+        <soap:binding style="document" 
transport="http://schemas.xmlsoap.org/soap/http"/>
+        <wsdl:operation name="greetMeMultilevelExtension">
+            <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:Greeter_SOAPBinding">
+            <soap:address 
location="http://localhost:9000/SoapContext/SoapPort"/>
+            <wswa:UsingAddressing 
xmlns:wswa="http://www.w3.org/2005/02/addressing/wsdl"/>
+        </wsdl:port>
+    </wsdl:service>
+</wsdl:definitions>

Reply via email to