diff --git a/modules/kernel/src/org/apache/axis2/description/WSDL11ToAxisServiceBuilder.java b/modules/kernel/src/org/apache/axis2/description/WSDL11ToAxisServiceBuilder.java index 7554452f06..68456cb54f 100644 --- a/modules/kernel/src/org/apache/axis2/description/WSDL11ToAxisServiceBuilder.java +++ b/modules/kernel/src/org/apache/axis2/description/WSDL11ToAxisServiceBuilder.java @@ -1766,6 +1766,11 @@ private Map createSchemaForPorttype(String namespaceURI, namespacePrefixMap, boEntry); + // No wrapped element needs to be created + if (!boEntry.isWrappedInput()) { + continue; + } + elementDeclaration.appendChild(newComplexType); String namespaceToUse = namespaceURI; @@ -1855,6 +1860,12 @@ private Map createSchemaForPorttype(String namespaceURI, namespaceImportsMap, namespacePrefixMap, boEntry); + + // No wrapped element needs to be created + if (!boEntry.isWrappedInput()) { + continue; + } + elementDeclaration.appendChild(newComplexType); String namespaceToUse = namespaceURI; @@ -2259,7 +2270,11 @@ private void addPartToElement(Part part, "and use the type attribute."); } else { // The presense of an element means that a wrapper xsd element is not needed. - boe.setWrappedOutput(false); + if (isOutMessage){ + boe.setWrappedOutput(false); + } else { + boe.setWrappedInput(false); + } if (log.isDebugEnabled()) { log.debug("The binding operation " + bindingOperationName + " references message part " + diff --git a/modules/kernel/test-resources/wsdl/nonduplicatedElements.wsdl b/modules/kernel/test-resources/wsdl/nonduplicatedElements.wsdl new file mode 100644 index 0000000000..93d9b452d5 --- /dev/null +++ b/modules/kernel/test-resources/wsdl/nonduplicatedElements.wsdl @@ -0,0 +1,55 @@ + + + + + + + + + + + + Message part referencing a global element declaration + + + + + + Message part referencing a type definition + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/kernel/test/org/apache/axis2/description/WSDL11ToAxisServiceBuilderTest.java b/modules/kernel/test/org/apache/axis2/description/WSDL11ToAxisServiceBuilderTest.java index cdf1c9b31a..f8bb920f2e 100644 --- a/modules/kernel/test/org/apache/axis2/description/WSDL11ToAxisServiceBuilderTest.java +++ b/modules/kernel/test/org/apache/axis2/description/WSDL11ToAxisServiceBuilderTest.java @@ -24,14 +24,19 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import javax.wsdl.xml.WSDLLocator; import javax.xml.namespace.QName; import org.apache.axis2.engine.AxisConfiguration; import org.apache.axis2.wsdl.WSDLConstants; +import org.apache.ws.commons.schema.XmlSchema; +import org.apache.ws.commons.schema.XmlSchemaElement; +import org.apache.ws.commons.schema.XmlSchemaObject; import org.xml.sax.InputSource; import junit.framework.TestCase; @@ -65,6 +70,43 @@ public void testMultipleFaultsWithSameMessage() throws Exception { } } + public void testNonDuplicatedElementsHttpBinding() throws Exception { + final String wsdlPath = "test-resources/wsdl/nonduplicatedElements.wsdl"; + InputStream in = new FileInputStream(wsdlPath); + final String targetNamespace = "http://www.example.org"; + final QName serviceName = new QName(targetNamespace, "FooService"); + final String portName = "FooHttpGetPort"; + + AxisService service = new WSDL11ToAxisServiceBuilder(in, serviceName, portName).populateService(); + List schemaDocuments = service.getSchema(); + List duplicatedGlobalElements = findDuplicatedGlobalElements(schemaDocuments); + // NO duplicated element should exists + assertTrue("Duplicated global element declarations found in '" + wsdlPath, + duplicatedGlobalElements.isEmpty()); + } + + protected List findDuplicatedGlobalElements(List schemaDocuments) { + List duplicatedGlobalElementDeclarations = new ArrayList(); + Set globalElementDeclarations = new HashSet(); + // Iterate over all schema documents + for (XmlSchema schemaDocument : schemaDocuments) { + for (XmlSchemaObject xmlSchemaObject : schemaDocument.getItems()) { + // Check only XML schema elements + if (xmlSchemaObject instanceof XmlSchemaElement) { + QName elementName = ((XmlSchemaElement)xmlSchemaObject).getQName(); + /* Was another element with the same name found in this or + other XML schema document? */ + if (globalElementDeclarations.contains(elementName)) { + duplicatedGlobalElementDeclarations.add(elementName); + } else { + globalElementDeclarations.add(elementName); + } + } + } + } + return duplicatedGlobalElementDeclarations; + } + private AxisService populateAxisService(AxisConfiguration axisConf, File wsdlFile) throws IOException { InputStream in = null; try {