TUSCANY-4072: Fix from Robin Yu for Tuscany fails to retrieve XSD type/element for nested WSDL with diff namespace(wsdl resolver issue)

git-svn-id: https://svn.apache.org/repos/asf/tuscany/sca-java-2.x/trunk@1406093 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLModelResolver.java b/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLModelResolver.java
index e419179..031c967 100644
--- a/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLModelResolver.java
+++ b/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLModelResolver.java
@@ -22,6 +22,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URI;
+import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -530,6 +531,7 @@
                     		//                with the URI of the top level WSDL which is set from the 
                     		//                relative location of the artifact that represents the WSDL
                     		wsdlDefinition.setURI(new URI(imp.getLocationURI()));
+                                indexRead(wsdlDefinition.getLocation().toURL(), context);
                     		resolved = resolveImports(WSDLDefinition.class, wsdlDefinition, context);
                     		if (!resolved.isUnresolved()) {
                     			if (resolved.getImportedDefinitions().isEmpty()) {
@@ -688,4 +690,52 @@
             is.close();
         }
     }
+
+    protected Map<String, String> indexRead(URL doc, ProcessorContext context) throws IOException, XMLStreamException {
+         
+       Map<String, String> wsdlImports = new HashMap<String, String>();
+       InputStream is = doc.openStream();
+         try {
+             // Set up a StreamSource for the composite file, since this has an associated URL that
+             // can be used by the parser to find references to other files such as DTDs
+             XMLInputFactory inputFactory = XMLInputFactory.newInstance();
+             StreamSource wsdlSource = new StreamSource(is, doc.toString());
+             XMLStreamReader reader = inputFactory.createXMLStreamReader(wsdlSource);
+             
+             int eventType = reader.getEventType();
+             int index = 0;
+             while (true) {
+                 if (eventType == XMLStreamConstants.START_ELEMENT) {
+                     if (WSDLDocumentProcessor.XSD.equals(reader.getName())) {
+                       String tns = reader.getAttributeValue(null, "targetNamespace");
+                       XSDefinition xsd = xsdFactory.createXSDefinition();
+                         xsd.setUnresolved(true);
+                         xsd.setNamespace(tns);
+                         try {
+                             xsd.setLocation(URI.create(doc.toURI() + "#" + index));
+                         } catch (URISyntaxException e) {
+                             //TODO
+                             e.printStackTrace();
+                         }
+                         index ++;
+                         // The definition is marked as resolved but not loaded
+                         xsd.setUnresolved(false);
+                         xsd.setSchema(null);
+                         if (contribution != null) {
+                             contribution.getModelResolver().addModel(xsd, context);
+                         }
+                     }
+                 }
+                 if (reader.hasNext()) {
+                     eventType = reader.next();
+                 } else {
+                     break;
+                 }
+             }
+             return wsdlImports;
+         } finally {
+             is.close();
+         }
+     }
+
 }