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 2008/09/15 19:13:27 UTC

svn commit: r695552 - in /cxf/trunk/tools: validator/src/main/java/org/apache/cxf/tools/validator/internal/ validator/src/test/java/org/apache/cxf/tools/validator/ validator/src/test/resources/validator_wsdl/ wsdlto/test/src/test/java/org/apache/cxf/to...

Author: dkulp
Date: Mon Sep 15 10:13:26 2008
New Revision: 695552

URL: http://svn.apache.org/viewvc?rev=695552&view=rev
Log:
[CXF-1793] Consider soap headers when determining if an operation is "unique"

Added:
    cxf/trunk/tools/validator/src/test/resources/validator_wsdl/cxf1793.wsdl   (with props)
Modified:
    cxf/trunk/tools/validator/src/main/java/org/apache/cxf/tools/validator/internal/SchemaValidator.java
    cxf/trunk/tools/validator/src/main/java/org/apache/cxf/tools/validator/internal/UniqueBodyPartsValidator.java
    cxf/trunk/tools/validator/src/test/java/org/apache/cxf/tools/validator/WSDLValidationTest.java
    cxf/trunk/tools/wsdlto/test/src/test/java/org/apache/cxf/tools/wsdlto/jaxws/CodeGenTest.java

Modified: cxf/trunk/tools/validator/src/main/java/org/apache/cxf/tools/validator/internal/SchemaValidator.java
URL: http://svn.apache.org/viewvc/cxf/trunk/tools/validator/src/main/java/org/apache/cxf/tools/validator/internal/SchemaValidator.java?rev=695552&r1=695551&r2=695552&view=diff
==============================================================================
--- cxf/trunk/tools/validator/src/main/java/org/apache/cxf/tools/validator/internal/SchemaValidator.java (original)
+++ cxf/trunk/tools/validator/src/main/java/org/apache/cxf/tools/validator/internal/SchemaValidator.java Mon Sep 15 10:13:26 2008
@@ -132,7 +132,7 @@
 
         for (InputSource is : xsdsInJar) {
             Message msg = new Message("CREATE_SCHEMA_LOADED_FROM_JAR", LOG, is.getSystemId());
-            LOG.log(Level.INFO, msg.toString());
+            LOG.log(Level.FINE, msg.toString());
             Document doc = docBuilder.parse(is.getByteStream());
             DOMSource stream = new DOMSource(doc, is.getSystemId());
             stream.setSystemId(is.getSystemId());
@@ -361,7 +361,7 @@
     public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId,
             String baseURI) {
         Message msg = new Message("RESOLVE_SCHEMA", LOG, namespaceURI, systemId, baseURI);
-        LOG.log(Level.INFO, msg.toString());
+        LOG.log(Level.FINE, msg.toString());
         if (NSFILEMAP.containsKey(namespaceURI)) {
             return loadLSInput(namespaceURI);
         }
@@ -398,7 +398,7 @@
                     lsin.setSystemId(resURL);
                     lsin.setByteStream(urlCon.getInputStream());
                     msg = new Message("RESOLVE_FROM_REMOTE", LOG, url);
-                    LOG.log(Level.INFO, msg.toString());
+                    LOG.log(Level.FINE, msg.toString());
                     return lsin;
                 } catch (Exception e) {
                     e.printStackTrace();
@@ -415,7 +415,7 @@
         URIResolver resolver;
         try {
             msg = new Message("RESOLVE_FROM_LOCAL", LOG, localFile);
-            LOG.log(Level.INFO, msg.toString());
+            LOG.log(Level.FINE, msg.toString());
 
             resolver = new URIResolver(localFile);
             if (resolver.isResolved()) {

Modified: cxf/trunk/tools/validator/src/main/java/org/apache/cxf/tools/validator/internal/UniqueBodyPartsValidator.java
URL: http://svn.apache.org/viewvc/cxf/trunk/tools/validator/src/main/java/org/apache/cxf/tools/validator/internal/UniqueBodyPartsValidator.java?rev=695552&r1=695551&r2=695552&view=diff
==============================================================================
--- cxf/trunk/tools/validator/src/main/java/org/apache/cxf/tools/validator/internal/UniqueBodyPartsValidator.java (original)
+++ cxf/trunk/tools/validator/src/main/java/org/apache/cxf/tools/validator/internal/UniqueBodyPartsValidator.java Mon Sep 15 10:13:26 2008
@@ -19,17 +19,26 @@
 
 package org.apache.cxf.tools.validator.internal;
 
+import java.util.Collection;
 import java.util.HashMap;
-import java.util.Iterator;
+import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
+import javax.wsdl.Binding;
+import javax.wsdl.BindingInput;
+import javax.wsdl.BindingOperation;
 import javax.wsdl.Definition;
 import javax.wsdl.Message;
 import javax.wsdl.Operation;
 import javax.wsdl.Part;
-import javax.wsdl.PortType;
+import javax.wsdl.extensions.ExtensibilityElement;
+import javax.wsdl.extensions.soap.SOAPHeader;
 import javax.xml.namespace.QName;
 
+import org.apache.cxf.helpers.CastUtils;
+
 public class UniqueBodyPartsValidator extends AbstractDefinitionValidator {
     private Map<QName, String> uniqueBodyPartsMap;
 
@@ -38,44 +47,65 @@
     }
 
     public boolean isValid() {
-        Iterator ite = def.getPortTypes().values().iterator();
-        while (ite.hasNext()) {
-            //
-            // Only check for unique body parts per portType.
-            // (Create a new Map for each portType.)
-            //
+        Collection<Binding> bindings = CastUtils.cast(def.getAllBindings().values());
+        for (Binding binding : bindings) {
             uniqueBodyPartsMap = new HashMap<QName, String>();
-            PortType portType = (PortType)ite.next();
-            Iterator ite2 = portType.getOperations().iterator();
-            while (ite2.hasNext()) {
-                Operation operation = (Operation)ite2.next();
+            List<BindingOperation> ops = CastUtils.cast(binding.getBindingOperations());
+            for (BindingOperation op : ops) {
+                Operation operation = op.getOperation();
                 if (operation.getInput() != null) {
                     Message inMessage = operation.getInput().getMessage();
-                    if (inMessage != null && !isUniqueBodyPart(operation.getName(), inMessage)) {
+                    BindingInput bin = op.getBindingInput();
+                    Set<String> headers = new HashSet<String>();
+                    if (bin != null) {
+                        List<ExtensibilityElement> lst = CastUtils.cast(bin.getExtensibilityElements());
+                        for (ExtensibilityElement ext : lst) {
+                            if (!(ext instanceof SOAPHeader)) {
+                                continue;
+                            }
+                            SOAPHeader header = (SOAPHeader)ext;
+                            if (!header.getMessage().equals(inMessage.getQName())) {
+                                continue;
+                            }
+                            headers.add(header.getPart());
+                        }
+                    }
+                    
+                    //find the headers as they don't contribute to the body
+                    
+                    if (inMessage != null && !isUniqueBodyPart(operation.getName(), 
+                                                               inMessage,
+                                                               headers,
+                                                               binding.getQName())) {
                         return false;
                     }
                 }
             }
         }
         return true;
-
     }
 
-    private boolean isUniqueBodyPart(String operationName, Message msg) {
-        Map partsMap = msg.getParts();
-        Iterator ite = partsMap.values().iterator();
-        if (ite.hasNext()) {
-            Part part = (Part)ite.next();
+    private boolean isUniqueBodyPart(String operationName, Message msg,
+                                     Collection<String> headers, QName bindingName) {
+        List<Part> partList = CastUtils.cast(msg.getOrderedParts(null));
+        for (Part part : partList) {
+            if (headers.contains(part.getName())) {
+                continue;
+            }
             if (part.getElementName() == null) {
                 return true;
             }
             String opName = getOperationNameWithSamePart(operationName, part);
             if (opName != null) {
                 addErrorMessage("Non unique body parts, operation " + "[ " + opName + " ] "
-                                + "and  operation [ " + operationName + " ] have the same body block "
+                                + "and  operation [ " + operationName + " ] in binding "
+                                + bindingName.toString()
+                                + " have the same body block: "
                                 + part.getElementName());
                 return false;
             }
+            //just need to check the first element
+            return true;
         }
         return true;
     }

Modified: cxf/trunk/tools/validator/src/test/java/org/apache/cxf/tools/validator/WSDLValidationTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/tools/validator/src/test/java/org/apache/cxf/tools/validator/WSDLValidationTest.java?rev=695552&r1=695551&r2=695552&view=diff
==============================================================================
--- cxf/trunk/tools/validator/src/test/java/org/apache/cxf/tools/validator/WSDLValidationTest.java (original)
+++ cxf/trunk/tools/validator/src/test/java/org/apache/cxf/tools/validator/WSDLValidationTest.java Mon Sep 15 10:13:26 2008
@@ -117,6 +117,14 @@
         assertTrue("Is not valid wsdl: " + getStdOut(),
                    getStdOut().indexOf("Passed Validation") > -1);
     }
+    @Test
+    public void testSOAPHeadersInMultiOperations() throws Exception {
+        String[] args = new String[] {"-verbose",
+                                      getLocation("/validator_wsdl/cxf1793.wsdl")};
+        WSDLValidator.main(args);
+        assertTrue(getStdErr(), getStdOut().indexOf("Passed Validation : Valid WSDL") > -1);
+    }
+
 
     @Test
     public void testWSIBP2210() throws Exception {

Added: cxf/trunk/tools/validator/src/test/resources/validator_wsdl/cxf1793.wsdl
URL: http://svn.apache.org/viewvc/cxf/trunk/tools/validator/src/test/resources/validator_wsdl/cxf1793.wsdl?rev=695552&view=auto
==============================================================================
--- cxf/trunk/tools/validator/src/test/resources/validator_wsdl/cxf1793.wsdl (added)
+++ cxf/trunk/tools/validator/src/test/resources/validator_wsdl/cxf1793.wsdl Mon Sep 15 10:13:26 2008
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="utf-8"?>
+<wsdl:definitions
+targetNamespace="http://cxf.apache.org/test/cxf1793/"
+xmlns:m="http://cxf.apache.org/test/cxf1793/"
+xmlns:misc="http://cxf.apache.org/test/cxf1793/types"
+xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+        <wsdl:documentation/>
+            <wsdl:types>
+        <schema xmlns="http://www.w3.org/2001/XMLSchema" 
+                targetNamespace="http://cxf.apache.org/test/cxf1793/types">
+            <element name="AutHeader">
+                <complexType>
+                    <sequence>
+                        <element name="headerVal" type="string"/>
+                    </sequence>
+                </complexType>
+            </element>
+            <element name="opOne">
+                <complexType>
+                    <sequence>
+                        <element name="foo" type="string"/>
+                    </sequence>
+                </complexType>
+            </element>
+            <element name="opOneResponse">
+                <complexType>
+                    <sequence>
+                        <element name="return" type="string"/>
+                    </sequence>
+                </complexType>
+            </element>
+
+
+            <element name="opTwo">
+                <complexType>
+                    <sequence>
+                        <element name="foo" type="string"/>
+                    </sequence>
+                </complexType>
+            </element>
+
+            <element name="opTwoResponse">
+                <complexType>
+                    <sequence>
+                        <element name="return" type="string"/>
+                    </sequence>
+                </complexType>
+            </element>
+        </schema>
+    </wsdl:types>
+        
+        <wsdl:message name="opOne">
+                <wsdl:part name="header" element="misc:AutHeader"/>
+                <wsdl:part name="request" element="misc:opOne"/>
+        </wsdl:message>
+        
+        <wsdl:message name="opOneResponse">
+                <wsdl:part name="response" element="misc:opOneResponse" />
+        </wsdl:message>
+
+        <wsdl:message name="opTwo">
+                <wsdl:part name="header" element="misc:AutHeader"/>
+                <wsdl:part name="request" element="misc:opTwo"/>
+        </wsdl:message>
+        
+        <wsdl:message name="opTwoResponse">
+                <wsdl:part name="response" element="misc:opTwoResponse"/>
+        </wsdl:message>
+
+        <wsdl:portType name="MiscPort">
+                <wsdl:operation name="opOne">
+                        <wsdl:input message="m:opOne" />
+                        <wsdl:output message="m:opOneResponse"/>
+                </wsdl:operation>       
+                <wsdl:operation name="opTwo">
+                        <wsdl:input message="m:opTwo"/>
+                        <wsdl:output message="m:opTwoResponse"/>
+                </wsdl:operation>
+        </wsdl:portType>
+        
+        <wsdl:binding name="MiscSoapBinding" type="m:MiscPort">
+                <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
+                <wsdl:operation name="opOne">
+                        <soap:operation soapAction="opOne" style="document"/>
+                        <wsdl:input>
+                                <soap:header message="m:opOne" part="header" use="literal"/>
+                                <soap:body parts="request" use="literal"/>
+                        </wsdl:input>
+                        <wsdl:output>
+                                <soap:body use="literal"/>
+                        </wsdl:output>
+                </wsdl:operation>
+                <wsdl:operation name="opTwo">
+                        <soap:operation soapAction="opTwo" style="document"/>
+                        <wsdl:input>
+                                <soap:header message="m:opTwo" part="header2" use="literal"/>
+                                <soap:body parts="request" use="literal"/>
+                        </wsdl:input>
+                        <wsdl:output>
+                                <soap:body use="literal"/>
+                        </wsdl:output>
+                </wsdl:operation>
+        </wsdl:binding>
+        
+        
+        <wsdl:service name="MiscService">
+                <wsdl:port name="MiscSoapPort" binding="m:MiscSoapBinding">
+                        <soap:address location="http://localhost:8080/adnfond/services/MiscService"/>
+                </wsdl:port>
+        </wsdl:service>
+</wsdl:definitions>

Propchange: cxf/trunk/tools/validator/src/test/resources/validator_wsdl/cxf1793.wsdl
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/tools/validator/src/test/resources/validator_wsdl/cxf1793.wsdl
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: cxf/trunk/tools/validator/src/test/resources/validator_wsdl/cxf1793.wsdl
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Modified: cxf/trunk/tools/wsdlto/test/src/test/java/org/apache/cxf/tools/wsdlto/jaxws/CodeGenTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/tools/wsdlto/test/src/test/java/org/apache/cxf/tools/wsdlto/jaxws/CodeGenTest.java?rev=695552&r1=695551&r2=695552&view=diff
==============================================================================
--- cxf/trunk/tools/wsdlto/test/src/test/java/org/apache/cxf/tools/wsdlto/jaxws/CodeGenTest.java (original)
+++ cxf/trunk/tools/wsdlto/test/src/test/java/org/apache/cxf/tools/wsdlto/jaxws/CodeGenTest.java Mon Sep 15 10:13:26 2008
@@ -1270,4 +1270,14 @@
         assertEquals(1, sei.getMethods().length);
         assertFalse(Void.TYPE.equals(sei.getMethods()[0].getReturnType()));
     }
+
+    @Test
+    public void testsafasdasf()  throws Exception {
+        env.put(ToolConstants.CFG_WSDLURL, 
+                "/tmp/cxf-1793/src/main/resources/com/edb/adnfond/transport/ws/misc/HeaderInRequestMsg.wsdl");
+        env.put(ToolConstants.CFG_EXTRA_SOAPHEADER, "TRUE");
+        env.put(ToolConstants.CFG_VALIDATE_WSDL, ToolConstants.CFG_VALIDATE_WSDL);
+        processor.setContext(env);
+        processor.execute();
+    }
 }