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);
         }


Reply via email to