You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by sl...@apache.org on 2010/08/09 15:47:16 UTC

svn commit: r983647 - in /tuscany/sca-java-2.x/trunk: itest/scdl/src/test/java/org/apache/tuscany/sca/itest/scdl/ modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/ modules/implementation-java/ modu...

Author: slaws
Date: Mon Aug  9 13:47:15 2010
New Revision: 983647

URL: http://svn.apache.org/viewvc?rev=983647&view=rev
Log:
TUSCANY-3641 - process an @WebService(wsdlLocation="") annotation by reading the wsdl, identified by the location, from the current contribution. The WSDL is associated with the Java component type service by attaching it to the JavaInterface normalized interface slot. This is not ideal but does allow us to pull things out of the WSDL, such a as policy. The spec state that the component type should have interface.wsdl but this messes up our databinding code which expects the component service to exhibit an interface suitable for the actual implementation. 

Modified:
    tuscany/sca-java-2.x/trunk/itest/scdl/src/test/java/org/apache/tuscany/sca/itest/scdl/ValidateDependenciesTestCase.java
    tuscany/sca-java-2.x/trunk/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaComponentContextProvider.java
    tuscany/sca-java-2.x/trunk/modules/implementation-java/META-INF/MANIFEST.MF
    tuscany/sca-java-2.x/trunk/modules/implementation-java/pom.xml
    tuscany/sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/JAXWSProcessor.java
    tuscany/sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/xml/JavaImplementationProcessor.java
    tuscany/sca-java-2.x/trunk/modules/implementation-java/src/test/java/org/apache/tuscany/sca/implementation/java/introspect/impl/JAXWSProcessorTestCase.java
    tuscany/sca-java-2.x/trunk/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLInterfaceProcessor.java

Modified: tuscany/sca-java-2.x/trunk/itest/scdl/src/test/java/org/apache/tuscany/sca/itest/scdl/ValidateDependenciesTestCase.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/itest/scdl/src/test/java/org/apache/tuscany/sca/itest/scdl/ValidateDependenciesTestCase.java?rev=983647&r1=983646&r2=983647&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/itest/scdl/src/test/java/org/apache/tuscany/sca/itest/scdl/ValidateDependenciesTestCase.java (original)
+++ tuscany/sca-java-2.x/trunk/itest/scdl/src/test/java/org/apache/tuscany/sca/itest/scdl/ValidateDependenciesTestCase.java Mon Aug  9 13:47:15 2010
@@ -31,7 +31,11 @@ import org.junit.Test;
  * Uses maven-dependency-plugin config in the pom.xml
  * 
  * Current required jars are:
+ * 
+ * activation-1.1.jar
  * geronimo-stax-api_1.0_spec-1.0.1.jar
+ * jaxb-api-2.1.jar
+ * jaxb-impl-2.1.12.jar
  * jsr181-api-1.0-MR1.jar
  * junit-4.8.1.jar
  * tuscany-assembly-2.0-SNAPSHOT.jar
@@ -44,13 +48,20 @@ import org.junit.Test;
  * tuscany-common-java-2.0-SNAPSHOT.jar
  * tuscany-common-xml-2.0-SNAPSHOT.jar
  * tuscany-contribution-2.0-SNAPSHOT.jar
+ * tuscany-core-spi-2.0-SNAPSHOT.jar
+ * tuscany-databinding-2.0-SNAPSHOT.jar
+ * tuscany-databinding-jaxb-2.0-SNAPSHOT.jar
  * tuscany-deployment-2.0-SNAPSHOT.jar
  * tuscany-extensibility-2.0-SNAPSHOT.jar
  * tuscany-implementation-java-2.0-SNAPSHOT.jar
  * tuscany-interface-java-2.0-SNAPSHOT.jar
+ * tuscany-interface-wsdl-2.0-SNAPSHOT.jar
  * tuscany-monitor-2.0-SNAPSHOT.jar
  * tuscany-sca-api-2.0-SNAPSHOT.jar
+ * tuscany-xsd-2.0-SNAPSHOT.jar
+ * wsdl4j-1.6.2.jar
  * wstx-asl-3.2.4.jar
+ * XmlSchema-1.4.3.jar
  * 
  * TODO: WS binding drags in all runtime
  */
@@ -63,6 +74,6 @@ public class ValidateDependenciesTestCas
         Assert.assertTrue(dependenciesDir.exists());
         
         File[] dependencyFiles = dependenciesDir.listFiles();
-        Assert.assertEquals(28, dependencyFiles.length);
+        Assert.assertEquals(30, dependencyFiles.length);
     }
 }

Modified: tuscany/sca-java-2.x/trunk/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaComponentContextProvider.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaComponentContextProvider.java?rev=983647&r1=983646&r2=983647&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaComponentContextProvider.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaComponentContextProvider.java Mon Aug  9 13:47:15 2010
@@ -292,7 +292,8 @@ public class JavaComponentContextProvide
         Class<?> implClass = instanceFactoryProvider.getImplementationClass();
 
         Method method = JavaInterfaceUtil.findMethod(implClass, operation);
-        if( ((JavaOperation) operation).isAsyncServer() ) {
+        if (operation instanceof JavaOperation &&
+            ((JavaOperation) operation).isAsyncServer() ) {
         	return new JavaAsyncImplementationInvoker(operation, method, component);
         } else {
         	return new JavaImplementationInvoker(operation, method, component);

Modified: tuscany/sca-java-2.x/trunk/modules/implementation-java/META-INF/MANIFEST.MF
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/implementation-java/META-INF/MANIFEST.MF?rev=983647&r1=983646&r2=983647&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/implementation-java/META-INF/MANIFEST.MF (original)
+++ tuscany/sca-java-2.x/trunk/modules/implementation-java/META-INF/MANIFEST.MF Mon Aug  9 13:47:15 2010
@@ -36,6 +36,7 @@ Import-Package: javax.jws,
  org.apache.tuscany.sca.interfacedef.java;version="2.0.0",
  org.apache.tuscany.sca.interfacedef.java.impl;version="2.0.0";resolution:=optional,
  org.apache.tuscany.sca.interfacedef.util;version="2.0.0",
+ org.apache.tuscany.sca.interfacedef.wsdl;version="2.0.0",
  org.apache.tuscany.sca.monitor;version="2.0.0",
  org.apache.tuscany.sca.policy;version="2.0.0",
  org.apache.tuscany.sca.policy.util;version="2.0.0",

Modified: tuscany/sca-java-2.x/trunk/modules/implementation-java/pom.xml
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/implementation-java/pom.xml?rev=983647&r1=983646&r2=983647&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/implementation-java/pom.xml (original)
+++ tuscany/sca-java-2.x/trunk/modules/implementation-java/pom.xml Mon Aug  9 13:47:15 2010
@@ -40,6 +40,12 @@
             <artifactId>tuscany-interface-java</artifactId>
             <version>2.0-SNAPSHOT</version>
         </dependency>
+        
+        <dependency>
+            <groupId>org.apache.tuscany.sca</groupId>
+            <artifactId>tuscany-interface-wsdl</artifactId>
+            <version>2.0-SNAPSHOT</version>
+        </dependency>        
  
         <dependency>
             <groupId>org.apache.tuscany.sca</groupId>
@@ -83,7 +89,14 @@
             <artifactId>tuscany-binding-sca-runtime</artifactId>
             <version>2.0-SNAPSHOT</version>
             <scope>test</scope>
-        </dependency>        
+        </dependency>    
+        
+        <dependency>
+            <groupId>org.apache.tuscany.sca</groupId>
+            <artifactId>tuscany-binding-ws</artifactId>
+            <version>2.0-SNAPSHOT</version>
+            <scope>test</scope>
+        </dependency>             
 
     </dependencies>
 

Modified: tuscany/sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/JAXWSProcessor.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/JAXWSProcessor.java?rev=983647&r1=983646&r2=983647&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/JAXWSProcessor.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/JAXWSProcessor.java Mon Aug  9 13:47:15 2010
@@ -35,6 +35,9 @@ import org.apache.tuscany.sca.interfaced
 import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceContract;
 import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory;
 import org.apache.tuscany.sca.interfacedef.util.JavaXMLMapper;
+import org.apache.tuscany.sca.interfacedef.wsdl.WSDLFactory;
+import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface;
+import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterfaceContract;
 import org.apache.tuscany.sca.policy.Intent;
 import org.apache.tuscany.sca.policy.PolicyFactory;
 import org.oasisopen.sca.annotation.Remotable;
@@ -46,16 +49,15 @@ import org.oasisopen.sca.annotation.Remo
 public class JAXWSProcessor extends BaseJavaClassVisitor {
     
     private PolicyFactory policyFactory;
-
-	public JAXWSProcessor(AssemblyFactory assemblyFactory, JavaInterfaceFactory javaFactory, PolicyFactory policyFactory) {
-        super(assemblyFactory);
-        this.javaInterfaceFactory = javaFactory;   
-        this.policyFactory = policyFactory;
-    }
+    private WSDLFactory wsdlFactory;
     
     public JAXWSProcessor(ExtensionPointRegistry registry) {
         super(registry);
-        this.policyFactory = registry.getExtensionPoint(FactoryExtensionPoint.class).getFactory(PolicyFactory.class);
+        FactoryExtensionPoint factories = registry.getExtensionPoint(FactoryExtensionPoint.class);
+        this.wsdlFactory = factories.getFactory(WSDLFactory.class);
+        this.assemblyFactory = factories.getFactory(AssemblyFactory.class);
+        this.policyFactory = factories.getFactory(PolicyFactory.class);
+        this.javaInterfaceFactory = factories.getFactory(JavaInterfaceFactory.class);
     }
 
     @Override
@@ -72,22 +74,22 @@ public class JAXWSProcessor extends Base
     		// JCA 11015
     	}
     	
-        WebService webService = clazz.getAnnotation(WebService.class);
+        WebService webServiceAnnotation = clazz.getAnnotation(WebService.class);
+        org.oasisopen.sca.annotation.Service serviceAnnotation = clazz.getAnnotation(org.oasisopen.sca.annotation.Service.class);
         String tns = JavaXMLMapper.getNamespace(clazz);
         String localName = clazz.getSimpleName();
         Class<?> interfaze = clazz;
-        if (webService != null) {
-            tns = getValue(webService.targetNamespace(), tns);
-            localName = getValue(webService.name(), localName);
+        if (webServiceAnnotation != null &&
+            serviceAnnotation == null) {
+            tns = getValue(webServiceAnnotation.targetNamespace(), tns);
+            localName = getValue(webServiceAnnotation.name(), localName);
             
-            String serviceInterfaceName = webService.endpointInterface();
-            // TODO - how to resolve this interface name 
-            //        needs to be done higher up where we have 
-            //        access to the resolver. 
+            String serviceInterfaceName = webServiceAnnotation.endpointInterface();
+            String wsdlLocation = webServiceAnnotation.wsdlLocation();
 
             Service service;
             try {
-                service = createService(clazz, interfaze, localName);
+                service = createService(clazz, localName, serviceInterfaceName, wsdlLocation);
             } catch (InvalidInterfaceException e) {
                 throw new IntrospectionException(e);
             }
@@ -106,32 +108,48 @@ public class JAXWSProcessor extends Base
         return "".equals(value) ? defaultValue : value;
     }
     
-    public Service createService(Class<?> clazz, Class<?> interfaze, String name) throws InvalidInterfaceException {
+    public Service createService(Class<?> clazz, String serviceName, String javaInterfaceName, String wsdlFileName)  throws InvalidInterfaceException, IntrospectionException {
         Service service = assemblyFactory.createService();
-        JavaInterfaceContract interfaceContract = javaInterfaceFactory.createJavaInterfaceContract();
-        service.setInterfaceContract(interfaceContract);
 
-        if (name == null) {
-            service.setName(interfaze.getSimpleName());
+        if (serviceName != null) {
+            service.setName(serviceName);
+        } else if (javaInterfaceName != null){
+            service.setName(javaInterfaceName.substring(javaInterfaceName.lastIndexOf('.')));
+        } 
+        
+        // create the physical Java interface contract
+        JavaInterfaceContract javaInterfaceContract = javaInterfaceFactory.createJavaInterfaceContract();;
+        service.setInterfaceContract(javaInterfaceContract);
+        
+        if (javaInterfaceName != null &&
+            javaInterfaceName.length() > 0){
+            JavaInterface callInterface = javaInterfaceFactory.createJavaInterface();
+            callInterface.setName(javaInterfaceName);
+            callInterface.setRemotable(true);
+            callInterface.setUnresolved(true);
+            javaInterfaceContract.setInterface(callInterface);
         } else {
-            service.setName(name);
-        }
-
-        JavaInterface callInterface = javaInterfaceFactory.createJavaInterface(interfaze);
-        boolean remotable = clazz.getAnnotation(Remotable.class) != null;
-        if (remotable){
+            // we use the bean class as the service interface
+            JavaInterface callInterface = javaInterfaceFactory.createJavaInterface(clazz);
             callInterface.setRemotable(true);
+            callInterface.setUnresolved(false); // this will already be false but this makes it easy to follow the logic
+            javaInterfaceContract.setInterface(callInterface);
         }
-        service.getInterfaceContract().setInterface(callInterface);
         
-        if (callInterface.getCallbackClass() != null) {
-            JavaInterface callbackInterface = javaInterfaceFactory.createJavaInterface(callInterface.getCallbackClass());
-            if (remotable){
-                callbackInterface.setRemotable(true);
-            }
-            service.getInterfaceContract().setCallbackInterface(callbackInterface);
-        }
-        return service;
+        // create the logical WSDL interface if it's specified in 
+        // the @WebService annotation
+        if (wsdlFileName != null &&
+                wsdlFileName.length() > 0){         
+             WSDLInterface callInterface = wsdlFactory.createWSDLInterface();
+             callInterface.setUnresolved(true);
+             callInterface.setRemotable(true);
+            
+             WSDLInterfaceContract wsdlInterfaceContract = wsdlFactory.createWSDLInterfaceContract();
+             wsdlInterfaceContract.setInterface(callInterface);
+             wsdlInterfaceContract.setLocation(wsdlFileName);
+             javaInterfaceContract.setNormailizedWSDLContract(wsdlInterfaceContract);
+         }  
+         return service;
     }    
 
 }

Modified: tuscany/sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/xml/JavaImplementationProcessor.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/xml/JavaImplementationProcessor.java?rev=983647&r1=983646&r2=983647&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/xml/JavaImplementationProcessor.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/xml/JavaImplementationProcessor.java Mon Aug  9 13:47:15 2010
@@ -50,14 +50,24 @@ import org.apache.tuscany.sca.contributi
 import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
 import org.apache.tuscany.sca.contribution.resolver.ClassReference;
 import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
 import org.apache.tuscany.sca.core.FactoryExtensionPoint;
+import org.apache.tuscany.sca.core.UtilityExtensionPoint;
 import org.apache.tuscany.sca.implementation.java.IntrospectionException;
 import org.apache.tuscany.sca.implementation.java.JavaElementImpl;
 import org.apache.tuscany.sca.implementation.java.JavaImplementation;
 import org.apache.tuscany.sca.implementation.java.JavaImplementationFactory;
 import org.apache.tuscany.sca.implementation.java.introspect.JavaIntrospectionHelper;
+import org.apache.tuscany.sca.interfacedef.Compatibility;
+import org.apache.tuscany.sca.interfacedef.IncompatibleInterfaceContractException;
 import org.apache.tuscany.sca.interfacedef.Interface;
+import org.apache.tuscany.sca.interfacedef.InterfaceContract;
+import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper;
 import org.apache.tuscany.sca.interfacedef.java.JavaInterface;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceContract;
+import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition;
+import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface;
+import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterfaceContract;
 import org.apache.tuscany.sca.monitor.Monitor;
 import org.apache.tuscany.sca.monitor.Problem;
 import org.apache.tuscany.sca.monitor.Problem.Severity;
@@ -74,13 +84,18 @@ public class JavaImplementationProcessor
     private AssemblyFactory assemblyFactory;
     private PolicyFactory policyFactory;
     private PolicySubjectProcessor policyProcessor;
-    
+    private StAXArtifactProcessor<Object> extensionProcessor;
+    private transient InterfaceContractMapper interfaceContractMapper;
 
-    public JavaImplementationProcessor(FactoryExtensionPoint modelFactories) {
+    public JavaImplementationProcessor(ExtensionPointRegistry registry,  StAXArtifactProcessor<?> staxProcessor) {
+        FactoryExtensionPoint modelFactories = registry.getExtensionPoint(FactoryExtensionPoint.class);
         this.assemblyFactory = modelFactories.getFactory(AssemblyFactory.class);
         this.policyFactory = modelFactories.getFactory(PolicyFactory.class);
         this.javaFactory = modelFactories.getFactory(JavaImplementationFactory.class);
         this.policyProcessor = new PolicySubjectProcessor(policyFactory);
+        this.extensionProcessor = (StAXArtifactProcessor<Object>)staxProcessor;
+        UtilityExtensionPoint utilities = registry.getExtensionPoint(UtilityExtensionPoint.class);
+        this.interfaceContractMapper = utilities.getUtility(InterfaceContractMapper.class);
     }
 
     /**
@@ -190,7 +205,10 @@ public class JavaImplementationProcessor
 
 	        checkNoStaticAnnotations(monitor, javaImplementation);
 	        
+	        postJAXWSProcessorResolve(resolver, javaImplementation, context);
+	        
 	        javaImplementation.setUnresolved(false);
+	        
 	        mergeComponentType(resolver, javaImplementation, context);
 
 	        // FIXME the introspector should always create at least one service
@@ -309,6 +327,73 @@ public class JavaImplementationProcessor
 
         }
     }
+    
+//    private void postJAXWSProcessorResolve(ModelResolver resolver, JavaImplementation impl, ProcessorContext context)
+//        throws ContributionResolveException {
+//        for(Service service : impl.getServices()){
+//            InterfaceContract interfaceContract = service.getInterfaceContract();
+//            
+//            // InterfaceContract not marked as resolved so have to look 
+//            // at each type and work it out
+//            if (interfaceContract instanceof JavaInterfaceContract){
+//                JavaInterfaceContract javaInterfaceContract = (JavaInterfaceContract)interfaceContract;
+//                JavaInterface javaInterface = (JavaInterface)javaInterfaceContract.getInterface();
+//                if (javaInterface.isUnresolved()){
+//                    extensionProcessor.resolve(javaInterfaceContract, resolver, context);
+//                }
+//            } else {
+//                WSDLInterfaceContract wsdlInterfaceContract = (WSDLInterfaceContract)interfaceContract;
+//                WSDLInterface wsdlInterface = (WSDLInterface)wsdlInterfaceContract.getInterface();
+//                if (wsdlInterface.isUnresolved()){
+//                    //WSDLDefinition resolved = resolver.resolveModel(WSDLDefinition.class, wsdlInterface.getWsdlDefinition(), context);
+//                    extensionProcessor.resolve(wsdlInterfaceContract, resolver, context);
+//                }
+//            }
+//        }
+//    }
+    
+    private void postJAXWSProcessorResolve(ModelResolver resolver, JavaImplementation impl, ProcessorContext context)
+        throws ContributionResolveException, IncompatibleInterfaceContractException {
+        for(Service service : impl.getServices()){
+            JavaInterfaceContract javaInterfaceContract = (JavaInterfaceContract)service.getInterfaceContract();
+            
+            JavaInterface javaInterface = (JavaInterface)javaInterfaceContract.getInterface();
+            if (javaInterface.isUnresolved()){
+                extensionProcessor.resolve(javaInterfaceContract, resolver, context);
+            }
+            
+            WSDLInterfaceContract wsdlInterfaceContract = (WSDLInterfaceContract)javaInterfaceContract.getNormalizedWSDLContract();
+            if(wsdlInterfaceContract != null){
+                // The user has explicitly associated a WSDL with the Java implementation
+                // using a @WebService(wsdlLocation="...") annotation
+                WSDLInterface wsdlInterface = (WSDLInterface)wsdlInterfaceContract.getInterface();
+                if (wsdlInterface.isUnresolved()){
+                    //WSDLDefinition resolved = resolver.resolveModel(WSDLDefinition.class, wsdlInterface.getWsdlDefinition(), context);
+                    extensionProcessor.resolve(wsdlInterfaceContract, resolver, context);
+                    
+                    // check that the Java and WSDL contracts are compatible
+                    interfaceContractMapper.checkCompatibility(javaInterfaceContract, 
+                                                               wsdlInterfaceContract, 
+                                                               Compatibility.MUTUAL, 
+                                                               false, 
+                                                               false);
+                    
+                    // retrieve the resolved WSDL interface
+                    wsdlInterface = (WSDLInterface)wsdlInterfaceContract.getInterface();
+                    
+                    // copy policy from the WSDL interface to the Java interface
+                    javaInterface.getPolicySets().addAll(wsdlInterface.getPolicySets());
+                    javaInterface.getRequiredIntents().addAll(wsdlInterface.getRequiredIntents());
+                    
+                    // copy policy from the WSDL interface to the component type service
+                    service.getPolicySets().addAll(wsdlInterface.getPolicySets());
+                    service.getRequiredIntents().addAll(wsdlInterface.getRequiredIntents());                    
+                    
+                    // TODO - is there anything else to be copied from the user specified WSDL?
+                } 
+            }
+        }
+    }    
 
     private ComponentType getComponentType(ModelResolver resolver, JavaImplementation impl, ProcessorContext context) {
         String className = impl.getJavaClass().getName();

Modified: tuscany/sca-java-2.x/trunk/modules/implementation-java/src/test/java/org/apache/tuscany/sca/implementation/java/introspect/impl/JAXWSProcessorTestCase.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/implementation-java/src/test/java/org/apache/tuscany/sca/implementation/java/introspect/impl/JAXWSProcessorTestCase.java?rev=983647&r1=983646&r2=983647&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/implementation-java/src/test/java/org/apache/tuscany/sca/implementation/java/introspect/impl/JAXWSProcessorTestCase.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/implementation-java/src/test/java/org/apache/tuscany/sca/implementation/java/introspect/impl/JAXWSProcessorTestCase.java Mon Aug  9 13:47:15 2010
@@ -55,11 +55,19 @@ public class JAXWSProcessorTestCase {
     @Before
     public void setUp() throws Exception {
         ExtensionPointRegistry registry = new DefaultExtensionPointRegistry();
-        processor = new JAXWSProcessor(new DefaultAssemblyFactory(), new DefaultJavaInterfaceFactory(registry), new DefaultPolicyFactory());
+        processor = new JAXWSProcessor(registry);
         javaImplementationFactory = new DefaultJavaImplementationFactory();
     }
 
     @Test
+    public void testWebServiceNoName() throws Exception {
+        JavaImplementation type = javaImplementationFactory.createJavaImplementation();
+        processor.visitClass(Foo0Impl.class, type);
+        org.apache.tuscany.sca.assembly.Service service = getService(type, "Foo0Impl");
+        assertNotNull(service);
+    }  
+
+    @Test
     public void testWebServiceName() throws Exception {
         JavaImplementation type = javaImplementationFactory.createJavaImplementation();
         processor.visitClass(Foo1Impl.class, type);
@@ -75,6 +83,21 @@ public class JAXWSProcessorTestCase {
         assertNotNull(service);
     }    
 
+    @Test
+    public void testWebServiceWSDL() throws Exception {
+        JavaImplementation type = javaImplementationFactory.createJavaImplementation();
+        processor.visitClass(Foo3Impl.class, type);
+        org.apache.tuscany.sca.assembly.Service service = getService(type, "Foo3");
+        assertNotNull(service);
+    } 
+
+    @WebService()
+    private static class Foo0Impl{
+        public String doSomething(String aParam){
+            return null;
+        }
+    }
+
     @WebService(name="Foo1")
     private static class Foo1Impl{
         public String doSomething(String aParam){
@@ -86,12 +109,19 @@ public class JAXWSProcessorTestCase {
         public String doSomething(String aParam);
     }
     
-    @WebService(name="Foo2", endpointInterface="Foo2")
+    @WebService(name="Foo2", endpointInterface="org.apache.tuscany.sca.implementation.java.introspect.impl.JAXWSProcessorTestCase.Foo2")
     private static class Foo2Impl{
         public String doSomething(String aParam){
             return null;
         }
-    }    
+    }   
+    
+    @WebService(name="Foo3", wsdlLocation="foo3.wsdl")
+    private static class Foo3Impl{
+        public String doSomething(String aParam){
+            return null;
+        }
+    }  
     
 
 }

Modified: tuscany/sca-java-2.x/trunk/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLInterfaceProcessor.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLInterfaceProcessor.java?rev=983647&r1=983646&r2=983647&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLInterfaceProcessor.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/xml/WSDLInterfaceProcessor.java Mon Aug  9 13:47:15 2010
@@ -21,6 +21,9 @@ package org.apache.tuscany.sca.interface
 
 import static javax.xml.stream.XMLStreamConstants.END_ELEMENT;
 
+import java.net.URI;
+import java.util.List;
+
 import javax.wsdl.PortType;
 import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamException;
@@ -28,6 +31,7 @@ import javax.xml.stream.XMLStreamReader;
 import javax.xml.stream.XMLStreamWriter;
 
 import org.apache.tuscany.sca.assembly.xml.PolicySubjectProcessor;
+import org.apache.tuscany.sca.contribution.Artifact;
 import org.apache.tuscany.sca.contribution.processor.BaseStAXArtifactProcessor;
 import org.apache.tuscany.sca.contribution.processor.ContributionReadException;
 import org.apache.tuscany.sca.contribution.processor.ContributionResolveException;
@@ -362,8 +366,73 @@ public class WSDLInterfaceProcessor exte
      */
     public void resolve(WSDLInterfaceContract wsdlInterfaceContract, ModelResolver resolver, ProcessorContext context) throws ContributionResolveException {
         Monitor monitor = context.getMonitor();
+        
+        WSDLInterface wsdlInterface = (WSDLInterface)wsdlInterfaceContract.getInterface();
+        
+        // if the contract has a location but no WSDL definition yet we need to read the WSDL
+        // from the specified location and create an interface based on the first port type
+        // this is required if the user uses the @WebService(wsdlLocatio="") annotation in a
+        // Java component implementation. 
+        if (wsdlInterfaceContract.getLocation() != null &&
+            wsdlInterface.getWsdlDefinition() == null){
+            
+            WSDLDefinition wsdlDefinition = null;
+ 
+            URI wsdlFileURI = null;
+            
+            try {
+                wsdlFileURI = new URI(wsdlInterfaceContract.getLocation());
+            } catch (Exception ex) {
+                ex.printStackTrace();
+                // TODO - raise error
+            }
+            
+            if (wsdlFileURI.isAbsolute()){
+                // use the wsdli:wsdlLocation mechanism in the WSDLModelResolver to 
+                // load the WSDL from an absolute location                
+                wsdlDefinition = wsdlFactory.createWSDLDefinition();
+                wsdlDefinition.setUnresolved(true);
+                wsdlDefinition.setNamespace("nonamespace"); 
+                wsdlDefinition.getWsdliLocations().put("nonamespace", wsdlInterfaceContract.getLocation());
+            } else {
+                // Find the wsdl in the contribution ready for further resolution
+                try {
+                    URI contributionLocation = new URI(context.getContribution().getLocation());
+                    URI wsdlLocation = contributionLocation.resolve(wsdlFileURI);
+                    for (Artifact artifact : context.getContribution().getArtifacts()) {
+                        // TODO - SL a hack while I work out if the bigger picture will hang together
+                        //        need more intelligence when applying a relative URI to an existing URI. 
+                        if (artifact.getLocation().endsWith(wsdlInterfaceContract.getLocation())){
+                            //URI artifactLocation = new URI(artifact.getLocation()).normalize();
+                            //if (artifactLocation.equals(wsdlLocation)){
+                                wsdlDefinition = artifact.getModel();
+                                break;
+                            //}
+                        }
+                    }
+                    
+                } catch (Exception ex) {
+                    ex.printStackTrace();
+                   // TODO - raise error
+                }
+            }
+            
+            if (wsdlDefinition == null){
+                // TODO raise an error
+            }
+            
+            wsdlInterface.setWsdlDefinition(wsdlDefinition);
+            PortType portType = (PortType)wsdlDefinition.getDefinition().getAllPortTypes().values().iterator().next();
+            if(portType != null){
+                wsdlInterface.setName(portType.getQName());
+            } else {
+                // raise an error
+            }
+                
+        }
+        
         // Resolve the interface and callback interface
-        WSDLInterface wsdlInterface = resolveWSDLInterface((WSDLInterface)wsdlInterfaceContract.getInterface(), resolver, context);
+        wsdlInterface = resolveWSDLInterface(wsdlInterface, resolver, context);
         wsdlInterfaceContract.setInterface(wsdlInterface);
         
         // The forward interface (portType) may have a callback interface declared on it using an sca:callback attribute