Author: mmao
Date: Wed Jun 13 00:32:46 2007
New Revision: 546762
URL: http://svn.apache.org/viewvc?view=rev&rev=546762
Log:
CXF-670
Validator flags valid rpc/lit operations as invalid
it's valid to have parts in the message that are of type "element" if they
are headers.
Added:
incubator/cxf/trunk/tools/validator/src/test/resources/validator_wsdl/header.xsd
incubator/cxf/trunk/tools/validator/src/test/resources/validator_wsdl/header_rpc_lit.wsdl
incubator/cxf/trunk/tools/validator/src/test/resources/validator_wsdl/header_rpc_lit_2203_in.wsdl
incubator/cxf/trunk/tools/validator/src/test/resources/validator_wsdl/header_rpc_lit_2203_out.wsdl
Modified:
incubator/cxf/trunk/tools/validator/src/main/java/org/apache/cxf/tools/validator/internal/WSIBPValidator.java
incubator/cxf/trunk/tools/validator/src/test/java/org/apache/cxf/tools/validator/WSDLValidationTest.java
Modified:
incubator/cxf/trunk/tools/validator/src/main/java/org/apache/cxf/tools/validator/internal/WSIBPValidator.java
URL:
http://svn.apache.org/viewvc/incubator/cxf/trunk/tools/validator/src/main/java/org/apache/cxf/tools/validator/internal/WSIBPValidator.java?view=diff&rev=546762&r1=546761&r2=546762
==============================================================================
---
incubator/cxf/trunk/tools/validator/src/main/java/org/apache/cxf/tools/validator/internal/WSIBPValidator.java
(original)
+++
incubator/cxf/trunk/tools/validator/src/main/java/org/apache/cxf/tools/validator/internal/WSIBPValidator.java
Wed Jun 13 00:32:46 2007
@@ -25,7 +25,6 @@
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
-
import javax.jws.soap.SOAPBinding;
import javax.wsdl.Binding;
import javax.wsdl.BindingOperation;
@@ -35,6 +34,7 @@
import javax.wsdl.Operation;
import javax.wsdl.Part;
import javax.wsdl.PortType;
+import javax.xml.namespace.QName;
import org.apache.cxf.common.util.CollectionUtils;
import org.apache.cxf.common.util.StringUtils;
@@ -111,8 +111,8 @@
SoapBody outSoapBody = SOAPBindingUtil.getBindingOutputSOAPBody(bop);
if (inSoapBody != null &&
StringUtils.isEmpty(inSoapBody.getNamespaceURI())
|| outSoapBody != null &&
StringUtils.isEmpty(outSoapBody.getNamespaceURI())) {
- addErrorMessage("Violate WSI-BP-1.0 R2717 operation '"
- + bop.getName() + "' soapBody MUST have namespace
attribute");
+ addErrorMessage("Violate WSI-BP-1.0 R2717 soapBody in the
input/output of the binding operation '"
+ + bop.getName() + "' MUST have namespace
attribute");
return false;
}
@@ -267,6 +267,22 @@
return true;
}
+ private boolean isHeaderPart(final BindingOperation bop, final Part part) {
+ QName elementName = part.getElementName();
+ if (elementName != null) {
+ String partName = elementName.getLocalPart();
+ SoapHeader inSoapHeader =
SOAPBindingUtil.getBindingInputSOAPHeader(bop);
+ if (inSoapHeader != null) {
+ return partName.equals(inSoapHeader.getPart());
+ }
+ SoapHeader outSoapHeader =
SOAPBindingUtil.getBindingOutputSOAPHeader(bop);
+ if (outSoapHeader != null) {
+ return partName.equals(outSoapHeader.getPart());
+ }
+ }
+ return false;
+ }
+
public boolean checkR2203And2204() {
for (Iterator ite = def.getBindings().values().iterator();
ite.hasNext();) {
@@ -278,12 +294,14 @@
for (Iterator ite2 =
binding.getPortType().getOperations().iterator(); ite2.hasNext();) {
Operation operation = (Operation)ite2.next();
+ BindingOperation bop = wsdlHelper.getBindingOperation(def,
operation.getName());
if (operation.getInput() != null &&
operation.getInput().getMessage() != null) {
Message inMess = operation.getInput().getMessage();
for (Iterator ite3 =
inMess.getParts().values().iterator(); ite3.hasNext();) {
Part p = (Part)ite3.next();
- if
(style.equalsIgnoreCase(SOAPBinding.Style.RPC.name()) && p.getTypeName() ==
null) {
+ if
(style.equalsIgnoreCase(SOAPBinding.Style.RPC.name()) && p.getTypeName() == null
+ && !isHeaderPart(bop, p)) {
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 "
@@ -306,7 +324,8 @@
Message outMess = operation.getOutput().getMessage();
for (Iterator ite3 =
outMess.getParts().values().iterator(); ite3.hasNext();) {
Part p = (Part)ite3.next();
- if
(style.equalsIgnoreCase(SOAPBinding.Style.RPC.name()) && p.getTypeName() ==
null) {
+ if
(style.equalsIgnoreCase(SOAPBinding.Style.RPC.name()) && p.getTypeName() == null
+ && !isHeaderPart(bop, p)) {
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 "
Modified:
incubator/cxf/trunk/tools/validator/src/test/java/org/apache/cxf/tools/validator/WSDLValidationTest.java
URL:
http://svn.apache.org/viewvc/incubator/cxf/trunk/tools/validator/src/test/java/org/apache/cxf/tools/validator/WSDLValidationTest.java?view=diff&rev=546762&r1=546761&r2=546762
==============================================================================
---
incubator/cxf/trunk/tools/validator/src/test/java/org/apache/cxf/tools/validator/WSDLValidationTest.java
(original)
+++
incubator/cxf/trunk/tools/validator/src/test/java/org/apache/cxf/tools/validator/WSDLValidationTest.java
Wed Jun 13 00:32:46 2007
@@ -189,6 +189,37 @@
}
}
+ @Test
+ public void testWSIBPR2203() throws Exception {
+ try {
+ String[] args = new String[] {"-verbose",
+
getLocation("/validator_wsdl/header_rpc_lit.wsdl")};
+ WSDLValidator.main(args);
+ assertTrue(getStdOut().indexOf("Passed Validation : Valid WSDL") >
-1);
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail("No exception expected here, header_rpc_lit is a valid wsdl");
+ }
+
+ try {
+ String[] args = new String[] {"-verbose",
+
getLocation("/validator_wsdl/header_rpc_lit_2203_in.wsdl")};
+ WSDLValidator.main(args);
+ assertTrue(getStdErr().indexOf("soapbind:body element(s), only to
wsdl:part element(s)") > -1);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ try {
+ String[] args = new String[] {"-verbose",
+
getLocation("/validator_wsdl/header_rpc_lit_2203_out.wsdl")};
+ WSDLValidator.main(args);
+ assertTrue(getStdErr().indexOf("soapbind:body element(s), only to
wsdl:part element(s)") > -1);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
@Override
protected String getLocation(String wsdlFile) throws Exception {
Enumeration<URL> e =
WSDLValidationTest.class.getClassLoader().getResources(wsdlFile);
Added:
incubator/cxf/trunk/tools/validator/src/test/resources/validator_wsdl/header.xsd
URL:
http://svn.apache.org/viewvc/incubator/cxf/trunk/tools/validator/src/test/resources/validator_wsdl/header.xsd?view=auto&rev=546762
==============================================================================
---
incubator/cxf/trunk/tools/validator/src/test/resources/validator_wsdl/header.xsd
(added)
+++
incubator/cxf/trunk/tools/validator/src/test/resources/validator_wsdl/header.xsd
Wed Jun 13 00:32:46 2007
@@ -0,0 +1,81 @@
+<?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.
+-->
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:x1="http://apache.org/headers/coloc/types"
targetNamespace="http://apache.org/headers/coloc/types"
elementFormDefault="qualified">
+ <element name="header" type="x1:headerInfo"/>
+ <complexType name="headerInfo">
+ <sequence>
+ <element name="originator" type="xsd:string"/>
+ <element name="message" type="xsd:string"/>
+ </sequence>
+ </complexType>
+ <element name="inHeader" type="x1:inHeaderT"/>
+ <complexType name="inHeaderT">
+ <sequence>
+ <element name="requestType" type="xsd:string"/>
+ </sequence>
+ </complexType>
+ <element name="inHeaderResponse" type="x1:inHeaderResponseT"/>
+ <complexType name="inHeaderResponseT">
+ <sequence>
+ <element name="responseType" type="xsd:string"/>
+ </sequence>
+ </complexType>
+ <element name="outHeader" type="x1:outHeaderT"/>
+ <complexType name="outHeaderT">
+ <sequence>
+ <element name="requestType" type="xsd:string"/>
+ </sequence>
+ </complexType>
+ <element name="outHeaderResponse" type="x1:outHeaderResponseT"/>
+ <complexType name="outHeaderResponseT">
+ <sequence>
+ <element name="responseType" type="xsd:string"/>
+ </sequence>
+ </complexType>
+ <element name="inoutHeader" type="x1:inoutHeaderT"/>
+ <complexType name="inoutHeaderT">
+ <sequence>
+ <element name="requestType" type="xsd:string"/>
+ </sequence>
+ </complexType>
+ <element name="inoutHeaderResponse" type="x1:inoutHeaderResponseT"/>
+ <complexType name="inoutHeaderResponseT">
+ <sequence>
+ <element name="responseType" type="xsd:string"/>
+ </sequence>
+ </complexType>
+ <element name="pingMe" type="x1:pingMeT"/>
+ <complexType name="pingMeT">
+ <sequence>
+ <element name="faultType" type="xsd:string"/>
+ </sequence>
+ </complexType>
+ <element name="pingMeResponse" type="x1:pingMeResponseT"/>
+ <complexType name="pingMeResponseT">
+ <sequence/>
+ </complexType>
+ <element name="faultDetail" type="x1:faultDetailT"/>
+ <complexType name="faultDetailT">
+ <sequence>
+ <element name="minor" type="xsd:short"/>
+ <element name="major" type="xsd:short"/>
+ </sequence>
+ </complexType>
+</schema>
Added:
incubator/cxf/trunk/tools/validator/src/test/resources/validator_wsdl/header_rpc_lit.wsdl
URL:
http://svn.apache.org/viewvc/incubator/cxf/trunk/tools/validator/src/test/resources/validator_wsdl/header_rpc_lit.wsdl?view=auto&rev=546762
==============================================================================
---
incubator/cxf/trunk/tools/validator/src/test/resources/validator_wsdl/header_rpc_lit.wsdl
(added)
+++
incubator/cxf/trunk/tools/validator/src/test/resources/validator_wsdl/header_rpc_lit.wsdl
Wed Jun 13 00:32:46 2007
@@ -0,0 +1,78 @@
+<?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.
+-->
+<definitions name="soap_header"
targetNamespace="http://apache.org/headers/rpc_lit"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:jms="http://cxf.apache.org/transports/jms"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xformat="http://cxf.apache.org/bindings/xformat"
xmlns:tns="http://apache.org/headers/rpc_lit"
xmlns:x1="http://apache.org/headers/coloc/types"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ <types>
+ <schema targetNamespace="http://apache.org/headers/rpc_lit"
xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+ <xsd:import namespace="http://apache.org/headers/coloc/types"
schemaLocation="./header.xsd"/>
+ </schema>
+ </types>
+ <message name="inHeaderRequest">
+ <part type="x1:inHeaderT" name="in"/>
+ <part element="x1:header" name="header"/>
+ </message>
+ <message name="inHeaderResponse">
+ <part type="x1:inHeaderResponseT" name="out"/>
+ </message>
+ <message name="outHeaderRequest">
+ <part type="x1:outHeaderT" name="in"/>
+ </message>
+ <message name="outHeaderResponse">
+ <part type="x1:outHeaderResponseT" name="out"/>
+ <part element="x1:header" name="header"/>
+ </message>
+ <portType name="headerTester">
+ <operation name="inHeader">
+ <input message="tns:inHeaderRequest" name="inHeaderRequest"/>
+ <output message="tns:inHeaderResponse" name="inHeaderResponse"/>
+ </operation>
+ <operation name="outHeader">
+ <input message="tns:outHeaderRequest" name="outHeaderRequest"/>
+ <output message="tns:outHeaderResponse" name="outHeaderResponse"/>
+ </operation>
+ </portType>
+ <binding name="headerTesterSOAPBinding" type="tns:headerTester">
+ <soap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http"/>
+ <operation name="inHeader">
+ <soap:operation soapAction="" style="rpc"/>
+ <input name="inHeaderRequest">
+ <soap:body namespace="http://apache.org/headers/coloc/types"
parts="in" use="literal"/>
+ <soap:header message="tns:inHeaderRequest" part="header"
use="literal"/>
+ </input>
+ <output name="inHeaderResponse">
+ <soap:body namespace="http://apache.org/headers/coloc/types"
use="literal"/>
+ </output>
+ </operation>
+ <operation name="outHeader">
+ <soap:operation soapAction="" style="rpc"/>
+ <input name="outHeaderRequest">
+ <soap:body namespace="http://apache.org/headers/coloc/types"
use="literal"/>
+ </input>
+ <output name="outHeaderResponse">
+ <soap:body namespace="http://apache.org/headers/coloc/types"
parts="out" use="literal"/>
+ <soap:header message="tns:outHeaderResponse" part="header"
use="literal"/>
+ </output>
+ </operation>
+ </binding>
+ <service name="SOAPHeaderService">
+ <port binding="tns:headerTesterSOAPBinding" name="SoapPort">
+ <soap:address location="http://localhost:9222/headers"/>
+ </port>
+ </service>
+</definitions>
Added:
incubator/cxf/trunk/tools/validator/src/test/resources/validator_wsdl/header_rpc_lit_2203_in.wsdl
URL:
http://svn.apache.org/viewvc/incubator/cxf/trunk/tools/validator/src/test/resources/validator_wsdl/header_rpc_lit_2203_in.wsdl?view=auto&rev=546762
==============================================================================
---
incubator/cxf/trunk/tools/validator/src/test/resources/validator_wsdl/header_rpc_lit_2203_in.wsdl
(added)
+++
incubator/cxf/trunk/tools/validator/src/test/resources/validator_wsdl/header_rpc_lit_2203_in.wsdl
Wed Jun 13 00:32:46 2007
@@ -0,0 +1,60 @@
+<?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.
+-->
+<definitions name="soap_header"
targetNamespace="http://apache.org/headers/rpc_lit"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:jms="http://cxf.apache.org/transports/jms"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xformat="http://cxf.apache.org/bindings/xformat"
xmlns:tns="http://apache.org/headers/rpc_lit"
xmlns:x1="http://apache.org/headers/coloc/types"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ <types>
+ <schema targetNamespace="http://apache.org/headers/rpc_lit"
xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+ <xsd:import namespace="http://apache.org/headers/coloc/types"
schemaLocation="./header.xsd"/>
+ </schema>
+ </types>
+ <message name="inHeaderRequest">
+ <part type="x1:inHeaderT" name="in"/>
+ <part element="x1:header" name="header"/>
+ </message>
+ <message name="inHeaderResponse">
+ <part type="x1:inHeaderResponseT" name="out"/>
+ </message>
+ <portType name="headerTester">
+ <operation name="inHeader">
+ <input message="tns:inHeaderRequest" name="inHeaderRequest"/>
+ <output message="tns:inHeaderResponse" name="inHeaderResponse"/>
+ </operation>
+ </portType>
+ <binding name="headerTesterSOAPBinding" type="tns:headerTester">
+ <soap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http"/>
+ <operation name="inHeader">
+ <soap:operation soapAction="" style="rpc"/>
+ <input name="inHeaderRequest">
+ <!--
+ If the part:header is not a soap:header, then it violate
the R2203, means RPC part:element must ref the type
+ <soap:body
namespace="http://apache.org/headers/coloc/types" parts="in" use="literal"/>
+ <soap:header message="tns:inHeaderRequest" part="header"
use="literal"/>
+ -->
+ </input>
+ <output name="inHeaderResponse">
+ <soap:body namespace="http://apache.org/headers/coloc/types"
use="literal"/>
+ </output>
+ </operation>
+ </binding>
+ <service name="SOAPHeaderService">
+ <port binding="tns:headerTesterSOAPBinding" name="SoapPort">
+ <soap:address location="http://localhost:9222/headers"/>
+ </port>
+ </service>
+</definitions>
Added:
incubator/cxf/trunk/tools/validator/src/test/resources/validator_wsdl/header_rpc_lit_2203_out.wsdl
URL:
http://svn.apache.org/viewvc/incubator/cxf/trunk/tools/validator/src/test/resources/validator_wsdl/header_rpc_lit_2203_out.wsdl?view=auto&rev=546762
==============================================================================
---
incubator/cxf/trunk/tools/validator/src/test/resources/validator_wsdl/header_rpc_lit_2203_out.wsdl
(added)
+++
incubator/cxf/trunk/tools/validator/src/test/resources/validator_wsdl/header_rpc_lit_2203_out.wsdl
Wed Jun 13 00:32:46 2007
@@ -0,0 +1,61 @@
+<?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.
+-->
+<definitions name="soap_header"
targetNamespace="http://apache.org/headers/rpc_lit"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:jms="http://cxf.apache.org/transports/jms"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xformat="http://cxf.apache.org/bindings/xformat"
xmlns:tns="http://apache.org/headers/rpc_lit"
xmlns:x1="http://apache.org/headers/coloc/types"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ <types>
+ <schema targetNamespace="http://apache.org/headers/rpc_lit"
xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+ <xsd:import namespace="http://apache.org/headers/coloc/types"
schemaLocation="./header.xsd"/>
+ </schema>
+ </types>
+ <message name="outHeaderRequest">
+ <part type="x1:outHeaderT" name="in"/>
+ </message>
+ <message name="outHeaderResponse">
+ <part type="x1:outHeaderResponseT" name="out"/>
+ <part element="x1:header" name="header"/>
+ </message>
+
+ <portType name="headerTester">
+ <operation name="outHeader">
+ <input message="tns:outHeaderRequest" name="outHeaderRequest"/>
+ <output message="tns:outHeaderResponse" name="outHeaderResponse"/>
+ </operation>
+ </portType>
+ <binding name="headerTesterSOAPBinding" type="tns:headerTester">
+ <soap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http"/>
+ <operation name="outHeader">
+ <soap:operation soapAction="" style="rpc"/>
+ <input name="outHeaderRequest">
+ <soap:body namespace="http://apache.org/headers/coloc/types"
use="literal"/>
+ </input>
+ <output name="outHeaderResponse">
+ <!--
+ If the part:header is not a soap:header, then it violate
the R2203, means RPC part:element must ref the type
+ <soap:body parts="out" use="literal"/>
+ <soap:header message="tns:outHeaderResponse" part="header"
use="literal"/>
+ -->
+ </output>
+ </operation>
+ </binding>
+ <service name="SOAPHeaderService">
+ <port binding="tns:headerTesterSOAPBinding" name="SoapPort">
+ <soap:address location="http://localhost:9222/headers"/>
+ </port>
+ </service>
+</definitions>