From 3570ea7c8fba83ef7cb70132b830f0205621360d Mon Sep 17 00:00:00 2001 From: ramkumar Date: Mon, 15 Jun 2009 11:05:19 +0000 Subject: Fixes for TUSCANY-3079 git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@784727 13f79535-47bb-0310-9956-ffa450edef68 --- .../interfacedef/wsdl/xml/WSDLModelResolver.java | 61 +++++++++++++++------- .../sca/interfacedef/wsdl/xml/WSDLTestCase.java | 16 +++++- 2 files changed, 57 insertions(+), 20 deletions(-) (limited to 'java/sca/modules/interface-wsdl/src') diff --git a/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLModelResolver.java b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLModelResolver.java index 8c77acc93d..686236d1c2 100644 --- a/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLModelResolver.java +++ b/java/sca/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLModelResolver.java @@ -28,6 +28,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Collections; import javax.wsdl.Definition; import javax.wsdl.Operation; @@ -284,29 +285,32 @@ public class WSDLModelResolver implements ModelResolver { public T resolveModel(Class modelClass, T unresolved) { - // Lookup a definition for the given namespace - String namespace = ((WSDLDefinition)unresolved).getNamespace(); - if (namespace == null) { + WSDLDefinition resolved = null; + String namespace = ((WSDLDefinition)unresolved).getNamespace(); + if (namespace == null) { return modelClass.cast(unresolved); - } - List list = map.get(namespace); - WSDLDefinition resolved = aggregate(list); - if (resolved != null && !resolved.isUnresolved()) { - return modelClass.cast(resolved); - } - - // No definition found, delegate the resolution to the imports + } + + // Lookup a definition for the given namespace, from imports + List locations = new ArrayList(); + // Collection of namespace imports with location + Map locationMap = new HashMap(); for (Import import_ : this.contribution.getImports()) { if (import_ instanceof NamespaceImport) { NamespaceImport namespaceImport = (NamespaceImport)import_; if (namespaceImport.getNamespace().equals(namespace)) { - - // Delegate the resolution to the namespace import resolver - resolved = - namespaceImport.getModelResolver().resolveModel(WSDLDefinition.class, - (WSDLDefinition)unresolved); - if (!resolved.isUnresolved()) { - return modelClass.cast(resolved); + if (namespaceImport.getLocation() == null) { + // Delegate the resolution to the namespace import resolver + resolved = + namespaceImport.getModelResolver().resolveModel(WSDLDefinition.class, + (WSDLDefinition)unresolved); + if (!resolved.isUnresolved()) { + return modelClass.cast(resolved); + } + } else { + // We might have multiple imports for the same namespace, + // need to search them in lexical order. + locations.add(namespaceImport.getLocation()); } } } else if (import_ instanceof DefaultImport) { @@ -319,7 +323,28 @@ public class WSDLModelResolver implements ModelResolver { return modelClass.cast(resolved); } } + } + // Search namespace imports with locations in lexical order + Collections.sort(locations); + for (String location : locations) { + NamespaceImport namespaceImport = (NamespaceImport)locationMap.get(location); + // Delegate the resolution to the namespace import resolver + resolved = + namespaceImport.getModelResolver().resolveModel(WSDLDefinition.class, + (WSDLDefinition)unresolved); + if (!resolved.isUnresolved()) { + return modelClass.cast(resolved); + } + } + + + // Not found, lookup a definition for the given namespace, within contribution + List list = map.get(namespace); + resolved = aggregate(list); + if (resolved != null && !resolved.isUnresolved()) { + return modelClass.cast(resolved); } + return modelClass.cast(unresolved); } diff --git a/java/sca/modules/interface-wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLTestCase.java b/java/sca/modules/interface-wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLTestCase.java index 9009469d23..502d0a8a2d 100644 --- a/java/sca/modules/interface-wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLTestCase.java +++ b/java/sca/modules/interface-wsdl/src/test/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLTestCase.java @@ -28,8 +28,13 @@ import java.net.URL; import javax.xml.namespace.QName; +import org.apache.tuscany.sca.contribution.Contribution; +import org.apache.tuscany.sca.contribution.ContributionFactory; import org.apache.tuscany.sca.contribution.processor.ExtensibleURLArtifactProcessor; import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessorExtensionPoint; +import org.apache.tuscany.sca.contribution.resolver.ExtensibleModelResolver; +import org.apache.tuscany.sca.contribution.resolver.ModelResolver; +import org.apache.tuscany.sca.contribution.resolver.ModelResolverExtensionPoint; import org.apache.tuscany.sca.core.DefaultExtensionPointRegistry; import org.apache.tuscany.sca.core.ExtensionPointRegistry; import org.apache.tuscany.sca.core.FactoryExtensionPoint; @@ -45,16 +50,23 @@ import org.junit.Test; public class WSDLTestCase { private ExtensibleURLArtifactProcessor documentProcessor; + private ContributionFactory contributionFactory; private WSDLModelResolver wsdlResolver; + private ModelResolver resolver; @Before public void setUp() throws Exception { ExtensionPointRegistry extensionPoints = new DefaultExtensionPointRegistry(); URLArtifactProcessorExtensionPoint documentProcessors = extensionPoints.getExtensionPoint(URLArtifactProcessorExtensionPoint.class); documentProcessor = new ExtensibleURLArtifactProcessor(documentProcessors, null); - + FactoryExtensionPoint modelFactories = extensionPoints.getExtensionPoint(FactoryExtensionPoint.class); - wsdlResolver = new WSDLModelResolver(null, modelFactories); + contributionFactory = modelFactories.getFactory(ContributionFactory.class); + Contribution contribution = contributionFactory.createContribution(); + ModelResolverExtensionPoint modelResolvers = extensionPoints.getExtensionPoint(ModelResolverExtensionPoint.class); + resolver = new ExtensibleModelResolver(contribution, modelResolvers, modelFactories); + contribution.setModelResolver(resolver); + wsdlResolver = new WSDLModelResolver(contribution, modelFactories); } @Test -- cgit v1.2.3