Author: sagara Date: Mon Jul 25 11:53:08 2011 New Revision: 1150643 URL: http://svn.apache.org/viewvc?rev=1150643&view=rev Log: Applied patch for AXIS2-4170.
Modified: axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/WSDL20ToAxisServiceBuilder.java Modified: axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/WSDL20ToAxisServiceBuilder.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/WSDL20ToAxisServiceBuilder.java?rev=1150643&r1=1150642&r2=1150643&view=diff ============================================================================== --- axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/WSDL20ToAxisServiceBuilder.java (original) +++ axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/WSDL20ToAxisServiceBuilder.java Mon Jul 25 11:53:08 2011 @@ -42,6 +42,7 @@ import org.apache.woden.internal.wsdl20. import org.apache.woden.resolver.URIResolver; import org.apache.woden.schema.Schema; import org.apache.woden.types.NamespaceDeclaration; +import org.apache.woden.types.QNameTokenUnion; import org.apache.woden.wsdl20.Binding; import org.apache.woden.wsdl20.BindingFault; import org.apache.woden.wsdl20.BindingFaultReference; @@ -76,6 +77,8 @@ import org.apache.woden.wsdl20.extension import org.apache.woden.wsdl20.xml.DescriptionElement; import org.apache.woden.wsdl20.xml.DocumentableElement; import org.apache.woden.wsdl20.xml.DocumentationElement; +import org.apache.woden.wsdl20.xml.ImportElement; +import org.apache.woden.wsdl20.xml.InterfaceFaultElement; import org.apache.woden.wsdl20.xml.InterfaceMessageReferenceElement; import org.apache.woden.wsdl20.xml.TypesElement; import org.apache.woden.xml.XMLAttr; @@ -253,21 +256,7 @@ public class WSDL20ToAxisServiceBuilder // } DescriptionElement descriptionElement = description.toElement(); - TypesElement typesElement = descriptionElement - .getTypesElement(); - if (typesElement != null) { - Schema[] schemas = typesElement.getSchemas(); - for (int i = 0; i < schemas.length; i++) { - XmlSchema schemaDefinition = schemas[i].getSchemaDefinition(); - - // WSDL 2.0 spec requires that even the built-in schema should be returned - // once asked for schema definitions. But for data binding purposes we can ignore that - if (schemaDefinition != null && !Constants.URI_2001_SCHEMA_XSD - .equals(schemaDefinition.getTargetNamespace())) { - axisService.addSchema(schemaDefinition); - } - } - } + processTypes(descriptionElement); processService(); return axisService; @@ -275,6 +264,37 @@ public class WSDL20ToAxisServiceBuilder throw AxisFault.makeFault(e); } } + + /** + * recursively drills down to find all type definitions + * (XSD schemas) in all imported WSDLs and XSDs + * + * @param descriptionElement - a description element from where import elements + * and types can be found + */ + private void processTypes(DescriptionElement descriptionElement) { + TypesElement typesElement = descriptionElement + .getTypesElement(); + if (typesElement != null) { + Schema[] schemas = typesElement.getSchemas(); + for (int i = 0; i < schemas.length; i++) { + XmlSchema schemaDefinition = schemas[i].getSchemaDefinition(); + + // WSDL 2.0 spec requires that even the built-in schema should be returned + // once asked for schema definitions. But for data binding purposes we can ignore that + if (schemaDefinition != null && !Constants.URI_2001_SCHEMA_XSD + .equals(schemaDefinition.getTargetNamespace())) { + axisService.addSchema(schemaDefinition); + } + } + } + + ImportElement[] importElements = descriptionElement.getImportElements(); + for (int i = 0; i < importElements.length; i++) { + DescriptionElement descElem = importElements[i].getDescriptionElement(); + processTypes(descElem); // recursively drill down + } + } private void processEndpoints(Interface serviceInterface) throws AxisFault { Endpoint[] endpoints = wsdlService.getEndpoints(); @@ -493,7 +513,10 @@ public class WSDL20ToAxisServiceBuilder stringBasedNamespaceMap.put(namespaceDeclaration.getPrefix(), namespaceDeclaration.getNamespaceURI().toString()); } - + + DescriptionElement descriptionElement = description.toElement(); + createNamespaceMap(descriptionElement); + setupComplete = true; } catch (AxisFault e) { throw e; // just rethrow AxisFaults @@ -504,6 +527,29 @@ public class WSDL20ToAxisServiceBuilder throw AxisFault.makeFault(e); } } + + /** + * recursively drills down to get namespace pairs in nested imported elements + * + * @param descriptionElement - a description element from where import elements + * and types can be found + */ + private void createNamespaceMap(DescriptionElement descriptionElement) { + ImportElement[] importElements = descriptionElement.getImportElements(); + for (int i = 0; i < importElements.length; i++) { + DescriptionElement descElem = importElements[i].getDescriptionElement(); + NamespaceDeclaration[] namespaceDeclarations = descElem.getDeclaredNamespaces(); + for (int j = 0; j < namespaceDeclarations.length; j++) { + NamespaceDeclaration importedNamespaceDeclaration = namespaceDeclarations[j]; + if (!stringBasedNamespaceMap.containsKey(importedNamespaceDeclaration.getPrefix())) { + stringBasedNamespaceMap.put(importedNamespaceDeclaration.getPrefix(), + importedNamespaceDeclaration.getNamespaceURI().toString()); + } + } + + createNamespaceMap(descElem); // recursively drill down + } + } private AxisBinding processBinding(Binding binding, Interface serviceInterface) throws AxisFault { @@ -1079,9 +1125,16 @@ public class WSDL20ToAxisServiceBuilder if (interfaceFault == null) { throw new AxisFault("Interface Fault reference defined in operation " + opName + " cannot be found in interface"); } - - faultMessage.setElementQName(interfaceFault.getElementDeclaration().getName()); - faultMessage.setName(interfaceFault.getName().getLocalPart()); + + // retrieve interface fault element + InterfaceFaultElement interfaceFaultElement = interfaceFault.toElement(); + // drill down to get actual interface fault element definition + QNameTokenUnion interfaceFaultElementDef = interfaceFaultElement.getElement(); + QName qName = interfaceFaultElementDef.getQName(); + String name = qName.getLocalPart(); + + faultMessage.setElementQName(qName); + faultMessage.setName(name); axisOperation.setFaultMessages(faultMessage); }