From dea1131853d154b2e9276a911565bd73ac2e403d Mon Sep 17 00:00:00 2001 From: antelder Date: Tue, 6 Nov 2012 11:02:12 +0000 Subject: 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: http://svn.us.apache.org/repos/asf/tuscany@1406093 13f79535-47bb-0310-9956-ffa450edef68 --- .../interfacedef/wsdl/xml/WSDLModelResolver.java | 50 ++++++++++++++++++++++ 1 file changed, 50 insertions(+) (limited to 'sca-java-2.x') diff --git a/sca-java-2.x/trunk/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLModelResolver.java b/sca-java-2.x/trunk/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLModelResolver.java index e419179c6e..031c967142 100644 --- a/sca-java-2.x/trunk/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLModelResolver.java +++ b/sca-java-2.x/trunk/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLModelResolver.java @@ -22,6 +22,7 @@ package org.apache.tuscany.sca.interfacedef.wsdl.xml; 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 @@ public class WSDLModelResolver implements ModelResolver { // 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 @@ public class WSDLModelResolver implements ModelResolver { is.close(); } } + + protected Map indexRead(URL doc, ProcessorContext context) throws IOException, XMLStreamException { + + Map wsdlImports = new HashMap(); + 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(); + } + } + } -- cgit v1.2.3