Repository: cxf
Updated Branches:
  refs/heads/master a3b70f3a4 -> d1b812ee9


[CXF-6488] Binding style vs part type R2203 And R2204 problems in wsdl document


Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/d1b812ee
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/d1b812ee
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/d1b812ee

Branch: refs/heads/master
Commit: d1b812ee948d0412cc0c3864db67a3342b951e7e
Parents: a3b70f3
Author: Akitoshi Yoshida <a...@apache.org>
Authored: Mon Aug 17 13:51:32 2015 +0200
Committer: Akitoshi Yoshida <a...@apache.org>
Committed: Mon Aug 17 13:54:47 2015 +0200

----------------------------------------------------------------------
 .../validator/internal/WSIBPValidator.java      | 41 +++++++++-
 .../cxf/tools/validator/WSDLValidationTest.java |  8 ++
 .../test/resources/validator_wsdl/cxf6488.wsdl  | 84 ++++++++++++++++++++
 3 files changed, 129 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/d1b812ee/tools/validator/src/main/java/org/apache/cxf/tools/validator/internal/WSIBPValidator.java
----------------------------------------------------------------------
diff --git 
a/tools/validator/src/main/java/org/apache/cxf/tools/validator/internal/WSIBPValidator.java
 
b/tools/validator/src/main/java/org/apache/cxf/tools/validator/internal/WSIBPValidator.java
index fc70e91..e042087 100644
--- 
a/tools/validator/src/main/java/org/apache/cxf/tools/validator/internal/WSIBPValidator.java
+++ 
b/tools/validator/src/main/java/org/apache/cxf/tools/validator/internal/WSIBPValidator.java
@@ -22,8 +22,11 @@ package org.apache.cxf.tools.validator.internal;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Set;
+
 import javax.jws.soap.SOAPBinding;
 import javax.wsdl.Binding;
 import javax.wsdl.BindingOperation;
@@ -33,6 +36,10 @@ import javax.wsdl.Message;
 import javax.wsdl.Operation;
 import javax.wsdl.Part;
 import javax.wsdl.PortType;
+import javax.wsdl.WSDLElement;
+import javax.wsdl.extensions.mime.MIMEContent;
+import javax.wsdl.extensions.mime.MIMEMultipartRelated;
+import javax.wsdl.extensions.mime.MIMEPart;
 import javax.xml.namespace.QName;
 
 import org.apache.cxf.binding.soap.SOAPBindingUtil;
@@ -318,11 +325,12 @@ public class WSIBPValidator extends 
AbstractDefinitionValidator {
                 BindingOperation bop = wsdlHelper.getBindingOperation(def, 
operation.getName());
                 if (operation.getInput() != null && 
operation.getInput().getMessage() != null) {
                     Message inMess = operation.getInput().getMessage();
+                    Set<String> ignorableParts = 
getIgnorableParts(bop.getBindingInput());
 
                     for (Iterator<?> ite3 = 
inMess.getParts().values().iterator(); ite3.hasNext();) {
                         Part p = (Part)ite3.next();
                         if 
(SOAPBinding.Style.RPC.name().equalsIgnoreCase(style) && p.getTypeName() == null
-                            && !isHeaderPart(bop, p)) {
+                            && !isHeaderPart(bop, p) && 
!isIgnorablePart(p.getName(), ignorableParts)) {
                             addErrorMessage("An rpc-literal binding in a 
DESCRIPTION MUST refer, "
                                             + "in its soapbind:body 
element(s), only to "
                                             + "wsdl:part element(s) that have 
been defined "
@@ -331,7 +339,7 @@ public class WSIBPValidator extends 
AbstractDefinitionValidator {
                         }
 
                         if 
(SOAPBinding.Style.DOCUMENT.name().equalsIgnoreCase(style)
-                            && p.getElementName() == null) {
+                            && p.getElementName() == null && 
!isIgnorablePart(p.getName(), ignorableParts)) {
                             addErrorMessage("A document-literal binding in a 
DESCRIPTION MUST refer, "
                                             + "in each of its soapbind:body 
element(s),"
                                             + "only to wsdl:part element(s)"
@@ -343,10 +351,12 @@ public class WSIBPValidator extends 
AbstractDefinitionValidator {
                 }
                 if (operation.getOutput() != null && 
operation.getOutput().getMessage() != null) {
                     Message outMess = operation.getOutput().getMessage();
+                    Set<String> ignorableParts = 
getIgnorableParts(bop.getBindingInput());
+
                     for (Iterator<?> ite3 = 
outMess.getParts().values().iterator(); ite3.hasNext();) {
                         Part p = (Part)ite3.next();
                         if 
(style.equalsIgnoreCase(SOAPBinding.Style.RPC.name()) && p.getTypeName() == null
-                            &&  !isHeaderPart(bop, p)) {
+                            && !isHeaderPart(bop, p) && 
!isIgnorablePart(p.getName(), ignorableParts)) {
                             addErrorMessage("An rpc-literal binding in a 
DESCRIPTION MUST refer, "
                                             + "in its soapbind:body 
element(s), only to "
                                             + "wsdl:part element(s) that have 
been defined "
@@ -355,7 +365,7 @@ public class WSIBPValidator extends 
AbstractDefinitionValidator {
                         }
 
                         if 
(style.equalsIgnoreCase(SOAPBinding.Style.DOCUMENT.name())
-                            && p.getElementName() == null) {
+                            && p.getElementName() == null && 
!isIgnorablePart(p.getName(), ignorableParts)) {
                             addErrorMessage("A document-literal binding in a 
DESCRIPTION MUST refer, "
                                             + "in each of its soapbind:body 
element(s),"
                                             + "only to wsdl:part element(s)"
@@ -371,6 +381,29 @@ public class WSIBPValidator extends 
AbstractDefinitionValidator {
         return true;
     }
 
+    private static boolean isIgnorablePart(String name, Set<String> 
ignorableParts) {
+        return ignorableParts != null && ignorableParts.contains(name);
+    }
+
+    private static Set<String> getIgnorableParts(WSDLElement ext) {
+        Set<String> parts = null;
+        if (ext != null && ext.getExtensibilityElements() != null && 
ext.getExtensibilityElements().size() > 0
+            && ext.getExtensibilityElements().get(0) instanceof 
MIMEMultipartRelated) {
+            MIMEMultipartRelated mpr = 
(MIMEMultipartRelated)ext.getExtensibilityElements().get(0);
+            List<MIMEPart> mps = CastUtils.cast(mpr.getMIMEParts());
+            parts = new HashSet<String>(mps.size());
+            for (Iterator<MIMEPart> it = mps.iterator(); it.hasNext();) {
+                MIMEPart mp = it.next();
+                if (mp.getExtensibilityElements() != null && 
mp.getExtensibilityElements().size() > 0
+                    && mp.getExtensibilityElements().get(0) instanceof 
MIMEContent) {
+                    
parts.add(((MIMEContent)mp.getExtensibilityElements().get(0)).getPart());
+                }
+            }
+        }
+
+        return parts;
+    }
+
     // TODO: Should also check SoapHeader/SoapHeaderFault
     public boolean checkR2205() {
         Collection<Binding> bindings = 
CastUtils.cast(def.getBindings().values());

http://git-wip-us.apache.org/repos/asf/cxf/blob/d1b812ee/tools/validator/src/test/java/org/apache/cxf/tools/validator/WSDLValidationTest.java
----------------------------------------------------------------------
diff --git 
a/tools/validator/src/test/java/org/apache/cxf/tools/validator/WSDLValidationTest.java
 
b/tools/validator/src/test/java/org/apache/cxf/tools/validator/WSDLValidationTest.java
index 9093221..2e34f3d 100644
--- 
a/tools/validator/src/test/java/org/apache/cxf/tools/validator/WSDLValidationTest.java
+++ 
b/tools/validator/src/test/java/org/apache/cxf/tools/validator/WSDLValidationTest.java
@@ -175,6 +175,14 @@ public class WSDLValidationTest extends ToolTestBase {
     }
 
     @Test
+    public void testWSIBPR2203ExcludeMIMEParts() throws Exception {
+        String[] args = new String[] {"-verbose",
+                                      
getLocation("/validator_wsdl/cxf6488.wsdl")};
+        WSDLValidator.main(args);
+        assertTrue(getStdOut().indexOf("Passed Validation : Valid WSDL") > -1);
+    }
+
+    @Test
     public void testWSIBPR2209() throws Exception {
         String[] args = new String[] {"-verbose",
                                       
getLocation("/validator_wsdl/hello_world_unbound_porttype_elements.wsdl")};

http://git-wip-us.apache.org/repos/asf/cxf/blob/d1b812ee/tools/validator/src/test/resources/validator_wsdl/cxf6488.wsdl
----------------------------------------------------------------------
diff --git a/tools/validator/src/test/resources/validator_wsdl/cxf6488.wsdl 
b/tools/validator/src/test/resources/validator_wsdl/cxf6488.wsdl
new file mode 100644
index 0000000..6fc81e6
--- /dev/null
+++ b/tools/validator/src/test/resources/validator_wsdl/cxf6488.wsdl
@@ -0,0 +1,84 @@
+<?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.
+-->
+<!-- 
+  
http://www.ws-i.org/profiles/attachmentsprofile-1.0.html#Referencing_Attachments_from_the_SOAP_Envelope
 
+-->
+<wsdl:definitions xmlns:types="http://example.com/mimetypes";
+                  xmlns:ref="http://ws-i.org/profiles/basic/1.1/xsd";
+                  xmlns:xsd="http://www.w3.org/2001/XMLSchema";
+                  xmlns:soapbind="http://schemas.xmlsoap.org/wsdl/soap/";
+                  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/";
+                  xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/";
+                  targetNamespace="http://example.com/mimewsdl";
+                  xmlns:tns="http://example.com/mimewsdl";>
+
+    <wsdl:types>
+        <xsd:schema targetNamespace="http://example.com/mimetypes";
+                xmlns:xsd="http://www.w3.org/2001/XMLSchema";>
+
+            <xsd:import namespace="http://ws-i.org/profiles/basic/1.1/xsd"; />
+            <xsd:element name="ClaimDetail" type="types:ClaimDetailType"/>
+            <xsd:complexType name="ClaimDetailType">
+                <xsd:sequence>
+                    <xsd:element name="Name" type="xsd:string"/>
+                    <xsd:element name="ClaimForm" type="ref:swaRef"/>
+                </xsd:sequence>
+            </xsd:complexType>
+            <xsd:element name="ClaimRefNo" type="xsd:string"/>
+        </xsd:schema>
+    </wsdl:types>
+
+    <wsdl:message name="ClaimIn">
+        <wsdl:part name="body" element="types:ClaimDetail"/>
+        <wsdl:part name="ClaimPhoto" type="xsd:base64Binary"/>
+    </wsdl:message>
+
+    <wsdl:message name="ClaimOut">
+        <wsdl:part name="out" element="types:ClaimRefNo"/>
+    </wsdl:message>
+
+    <wsdl:portType name="ClaimPortType">
+        <wsdl:operation name="SendClaim">
+            <wsdl:input message="tns:ClaimIn"/>
+            <wsdl:output message="tns:ClaimOut"/>
+        </wsdl:operation>
+    </wsdl:portType>
+
+    <wsdl:binding name="ClaimBinding" type="tns:ClaimPortType">
+        <soapbind:binding style="document" 
+                          transport="http://schemas.xmlsoap.org/soap/http"/>
+        <wsdl:operation name="SendClaim">
+            <soapbind:operation soapAction="http://example.com/soapaction"/>
+            <wsdl:input>
+                <mime:multipartRelated>
+                    <mime:part>
+                        <soapbind:body parts="body" use="literal"/>
+                    </mime:part>
+                    <mime:part>
+                        <mime:content part="ClaimPhoto" type="image/jpeg"/>
+                    </mime:part>
+                </mime:multipartRelated>
+            </wsdl:input>
+            <wsdl:output>
+                <soapbind:body use="literal" />
+            </wsdl:output>
+        </wsdl:operation>
+    </wsdl:binding>
+</wsdl:definitions>

Reply via email to