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