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/07/13 11:12:09 UTC

svn commit: r963624 [1/2] - in /tuscany/sca-java-2.x/trunk: compliance-tests/assembly/src/test/resources/ itest/bpel/helloworld/ itest/databindings/jaxb-top-down/src/main/resources/wsdl/wrapped/ itest/interfaces/src/main/java/org/apache/tuscany/sca/ite...

Author: slaws
Date: Tue Jul 13 09:12:08 2010
New Revision: 963624

URL: http://svn.apache.org/viewvc?rev=963624&view=rev
Log:
TUSCANY-3616 - Add code to check that that interface contracts a reference and reference binding and at service and service binding match. Motivated by BWS_2007. TO do this properly we have to test that the interfaces are described using the same IDL and if not convert to WSDL1.1 are required by the SCA specifications. There are a lot of changes here as doing this upset quite a few tests. Further work is required to look at the details of our WSDL generation process which looks a little suspect around wrapper namespaces.

Added:
    tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/ContractBuilder.java
    tuscany/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLContractBuilder.java
    tuscany/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/src/main/resources/META-INF/services/org.apache.tuscany.sca.assembly.builder.ContractBuilder
Removed:
    tuscany/sca-java-2.x/trunk/itest/jms/format-jmsobject/src/main/resources/jmsobject/helloworld.wsdl
    tuscany/sca-java-2.x/trunk/itest/jms/format-jmstextxml/src/main/java/org/apache/tuscany/sca/binding/jms/format/jmsbytes/helloworld/
Modified:
    tuscany/sca-java-2.x/trunk/compliance-tests/assembly/src/test/resources/tuscany-oasis-sca-tests-errors.properties
    tuscany/sca-java-2.x/trunk/itest/bpel/helloworld/pom.xml
    tuscany/sca-java-2.x/trunk/itest/databindings/jaxb-top-down/src/main/resources/wsdl/wrapped/hello-service.wsdl
    tuscany/sca-java-2.x/trunk/itest/interfaces/src/main/java/org/apache/tuscany/sca/itest/interfaces/LocalClientComponent.java
    tuscany/sca-java-2.x/trunk/itest/interfaces/src/main/java/org/apache/tuscany/sca/itest/interfaces/LocalClientComponentImpl.java
    tuscany/sca-java-2.x/trunk/itest/interfaces/src/test/java/org/apache/tuscany/sca/itest/interfaces/InterfacesTestCase.java
    tuscany/sca-java-2.x/trunk/itest/jms/format-jmsobject/src/main/resources/jmsobject/helloworld.composite
    tuscany/sca-java-2.x/trunk/itest/jms/format-jmstextxml/src/main/resources/jmstextxml/helloworld.wsdl
    tuscany/sca-java-2.x/trunk/itest/ws/wsdl/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/CustomerProfileData.java
    tuscany/sca-java-2.x/trunk/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/customerdata.xsd
    tuscany/sca-java-2.x/trunk/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/questionmark-include.wsdl
    tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/BuilderExtensionPoint.java
    tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/DefaultBuilderExtensionPoint.java
    tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/EndpointImpl.java
    tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/EndpointReferenceImpl.java
    tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/interfacedef/InterfaceContract.java
    tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/interfacedef/impl/InterfaceContractImpl.java
    tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/interfacedef/impl/InterfaceContractMapperImpl.java
    tuscany/sca-java-2.x/trunk/modules/assembly/src/main/resources/org/apache/tuscany/sca/assembly/builder/assembly-validation-messages.properties
    tuscany/sca-java-2.x/trunk/modules/binding-corba-runtime/src/test/java/org/apache/tuscany/sca/binding/corba/testing/service/mocks/TestInterfaceContract.java
    tuscany/sca-java-2.x/trunk/modules/binding-corba-runtime/src/test/java/org/apache/tuscany/sca/binding/corba/testing/service/mocks/TestRuntimeWire.java
    tuscany/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/BindingWSDLGenerator.java
    tuscany/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/Interface2WSDLGenerator.java
    tuscany/sca-java-2.x/trunk/modules/binding-ws/src/main/java/org/apache/tuscany/sca/binding/ws/impl/WebServiceBindingImpl.java
    tuscany/sca-java-2.x/trunk/modules/builder/src/main/java/org/apache/tuscany/sca/builder/impl/ComponentBuilderImpl.java
    tuscany/sca-java-2.x/trunk/modules/builder/src/main/java/org/apache/tuscany/sca/builder/impl/CompositeComponentTypeBuilderImpl.java
    tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/runtime/RuntimeEndpoint.java
    tuscany/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/runtime/RuntimeEndpointReference.java
    tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/CompositeActivatorImpl.java
    tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeEndpointImpl.java
    tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeEndpointReferenceImpl.java
    tuscany/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/impl/EndpointReferenceBinderImpl.java
    tuscany/sca-java-2.x/trunk/modules/interface-java/src/main/java/org/apache/tuscany/sca/interfacedef/java/JavaInterfaceContract.java
    tuscany/sca-java-2.x/trunk/modules/interface-java/src/main/java/org/apache/tuscany/sca/interfacedef/java/impl/JavaInterfaceContractImpl.java
    tuscany/sca-java-2.x/trunk/modules/interface-wsdl/src/main/java/org/apache/tuscany/sca/interfacedef/wsdl/impl/WSDLInterfaceContractImpl.java

Modified: tuscany/sca-java-2.x/trunk/compliance-tests/assembly/src/test/resources/tuscany-oasis-sca-tests-errors.properties
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/compliance-tests/assembly/src/test/resources/tuscany-oasis-sca-tests-errors.properties?rev=963624&r1=963623&r2=963624&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/compliance-tests/assembly/src/test/resources/tuscany-oasis-sca-tests-errors.properties (original)
+++ tuscany/sca-java-2.x/trunk/compliance-tests/assembly/src/test/resources/tuscany-oasis-sca-tests-errors.properties Tue Jul 13 09:12:08 2010
@@ -80,8 +80,8 @@ ASM_9005=org.apache.tuscany.sca.monitor.
 ASM_10001=org.apache.tuscany.sca.monitor.ValidationException: [Contribution: ASM_10001, Artifact: META-INF/definitions.xml, Definitions: jar:file:***ASM_10001***.zip!/META-INF/definitions.xml] - [ASM10001,POL30002] Duplicate intent {http://docs.oasis-open.org/ns/opencsa/scatests/200903}Fred found in domain
 ASM_10003=org.apache.tuscany.sca.monitor.ValidationException: [Contribution: ASM_10003, Artifact: META-INF/definitions.xml, Definitions: jar:file:***ASM_10003***.zip!/META-INF/definitions.xml] - XMLSchema validation error occured in: Test_ASM_10003.composite ,line = ***, column = ***, Message = cvc-complex-type.2.4.a: Invalid content was found starting with element 'component'. One of '{"http://docs.oasis-open.org/ns/opencsa/sca/200912":documentation, "http://docs.oasis-open.org/ns/opencsa/sca/200912":intent, "http://docs.oasis-open.org/ns/opencsa/sca/200912":policySet, "http://docs.oasis-open.org/ns/opencsa/sca/200912":bindingType, "http://docs.oasis-open.org/ns/opencsa/sca/200912":implementationType, WC[##other:"http://docs.oasis-open.org/ns/opencsa/sca/200912"]}' is expected.
 ASM_12003=org.apache.tuscany.sca.contribution.processor.ContributionResolveException: Invalid interface when resolving
-ASM_12007=org.apache.tuscany.sca.monitor.ValidationException: [Composite: {http://docs.oasis-open.org/ns/opencsa/sca/200912}, Component: TestComponent1] - [ASM50004,JCA30002,JCI80001] Component service interface incompatible with implementation service interface: Component = TestComponent1 Service = Service1 Operation operation1 not found on target
-ASM_12008=org.apache.tuscany.sca.monitor.ValidationException: [Composite: {http://docs.oasis-open.org/ns/opencsa/sca/200912}, Component: TEST_ASM_12008TestComponent1] - [ASM50004,JCA30002,JCI80001] Component service interface incompatible with implementation service interface: Component = TEST_ASM_12008TestComponent1 Service = Service1 Operation operation1 not found on target
+ASM_12007=org.apache.tuscany.sca.monitor.ValidationException: [Composite: {http://docs.oasis-open.org/ns/opencsa/sca/200912}, Component: TestComponent1, Composite: {http://docs.oasis-open.org/ns/opencsa/scatests/2009032}TestComposite5, Component: TestComposite5TestComponent1] - [ASM50004,JCA30002,JCI80001] Component service interface incompatible with implementation service interface: Component = TestComposite5TestComponent1 Service = Service1 Operations called operation2 are not compatible Operation argument types source = {http://www.w3.org/2001/XMLSchema}int target = {http://www.w3.org/2001/XMLSchema}string don't match for output types
+ASM_12008=org.apache.tuscany.sca.monitor.ValidationException: [Composite: {http://docs.oasis-open.org/ns/opencsa/sca/200912}, Component: TEST_ASM_12008TestComponent1, Composite: {http://docs.oasis-open.org/ns/opencsa/scatests/2009032}TestComposite5, Component: TestComposite5TestComponent1] - [ASM50004,JCA30002,JCI80001] Component service interface incompatible with implementation service interface: Component = TestComposite5TestComponent1 Service = Service1 Operations called operation2 are not compatible Operation argument types source = {http://www.w3.org/2001/XMLSchema}int target = {http://www.w3.org/2001/XMLSchema}string don't match for output types
 ASM_12011=org.apache.tuscany.sca.monitor.ValidationException: [Composite: {http://docs.oasis-open.org/ns/opencsa/sca/200912}, Component: TestComponent1] - [ASM60030,JCI50004,JCI80001] Component implementation not resolved: Component = TestComponent1 Uri = TestComponent1
 ASM_12012=org.apache.tuscany.sca.monitor.ValidationException: [Contribution: ASM_12012, Artifact: META-INF/sca-contribution.xml] - XMLSchema validation error occured in: jar:file:***ASM_12012***.zip!/META-INF/sca-contribution.xml ,line = ***, column = ***, Message = cvc-complex-type.2.4.a: Invalid content was found starting with element 'component'. One of '{"http://docs.oasis-open.org/ns/opencsa/sca/200912":documentation, "http://docs.oasis-open.org/ns/opencsa/sca/200912":deployable, "http://docs.oasis-open.org/ns/opencsa/sca/200912":importBase, "http://docs.oasis-open.org/ns/opencsa/sca/200912":exportBase, WC[##other:"http://docs.oasis-open.org/ns/opencsa/sca/200912"]}' is expected.
 ASM_13001=org.apache.tuscany.sca.monitor.ValidationException: [Contribution: ASM_13001, Artifact: Test_ASM_13001.composite] - XMLSchema validation error occured in: Test_ASM_13001.composite ,line = ***, column = ***, Message = cvc-complex-type.2.4.a: Invalid content was found starting with element 'sevrice'. One of '{"http://docs.oasis-open.org/ns/opencsa/sca/200912":service, "http://docs.oasis-open.org/ns/opencsa/sca/200912":reference, "http://docs.oasis-open.org/ns/opencsa/sca/200912":property, "http://docs.oasis-open.org/ns/opencsa/sca/200912":requires, "http://docs.oasis-open.org/ns/opencsa/sca/200912":policySetAttachment, WC[##other:"http://docs.oasis-open.org/ns/opencsa/sca/200912"]}' is expected.
@@ -91,4 +91,4 @@ ASM_13004=org.apache.tuscany.sca.monitor
 ASM_13005=org.apache.tuscany.sca.monitor.ValidationException: [Contribution: ASM_13005, Artifact: Test_ASM_13005.composite] - XMLSchema validation error occured in: Test_ASM_13005.composite ,line = ***, column = ***, Message = cvc-elt.2: The value of {abstract} in the element declaration for 'implementation' must be false.
 ASM_13006=org.apache.tuscany.sca.monitor.ValidationException: [Contribution: ASM_13006, Artifact: Test_ASM_13006.composite] - XMLSchema validation error occured in: Test_ASM_13006.composite ,line = ***, column = ***, Message = cvc-complex-type.3.2.2: Attribute 'callback' is not allowed to appear in element 'interface.java'.
 ASM_13007=org.apache.tuscany.sca.monitor.ValidationException: [Contribution: ASM_13007, Artifact: Test_ASM_13007.composite] - XMLSchema validation error occured in: Test_ASM_13007.composite ,line = ***, column = ***, Message = cvc-complex-type.3.2.2: Attribute 'mulplicity' is not allowed to appear in element 'reference'.
-ASM_13008=org.apache.tuscany.sca.monitor.ValidationException: [Contribution: ASM_13008, Artifact: Test_ASM_13008.composite] - XMLSchema validation error occured in: Test_ASM_13008.composite ,line = ***, column = ***, Message = cvc-complex-type.2.4.a: Invalid content was found starting with element 'operation'. One of '{"http://docs.oasis-open.org/ns/opencsa/sca/200912":documentation, "http://docs.oasis-open.org/ns/opencsa/sca/200912":wireFormat, "http://docs.oasis-open.org/ns/opencsa/sca/200912":operationSelector, "http://docs.oasis-open.org/ns/opencsa/sca/200912":requires, "http://docs.oasis-open.org/ns/opencsa/sca/200912":policySetAttachment}' is expected.
\ No newline at end of file
+ASM_13008=org.apache.tuscany.sca.monitor.ValidationException: [Contribution: ASM_13008, Artifact: Test_ASM_13008.composite] - XMLSchema validation error occured in: Test_ASM_13008.composite ,line = ***, column = ***, Message = cvc-complex-type.2.4.a: Invalid content was found starting with element 'operation'. One of '{"http://docs.oasis-open.org/ns/opencsa/sca/200912":documentation, "http://docs.oasis-open.org/ns/opencsa/sca/200912":wireFormat, "http://docs.oasis-open.org/ns/opencsa/sca/200912":operationSelector, "http://docs.oasis-open.org/ns/opencsa/sca/200912":requires, "http://docs.oasis-open.org/ns/opencsa/sca/200912":policySetAttachment}' is expected.

Modified: tuscany/sca-java-2.x/trunk/itest/bpel/helloworld/pom.xml
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/itest/bpel/helloworld/pom.xml?rev=963624&r1=963623&r2=963624&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/itest/bpel/helloworld/pom.xml (original)
+++ tuscany/sca-java-2.x/trunk/itest/bpel/helloworld/pom.xml Tue Jul 13 09:12:08 2010
@@ -56,6 +56,12 @@
 			<version>2.0-SNAPSHOT</version>
 			<scope>runtime</scope>
 		</dependency>
+		
+        <dependency>
+            <groupId>org.apache.tuscany.sca</groupId>
+            <artifactId>tuscany-binding-ws-wsdlgen</artifactId>
+            <version>2.0-SNAPSHOT</version>
+        </dependency> 		
 
 		<dependency>
 			<groupId>xerces</groupId>

Modified: tuscany/sca-java-2.x/trunk/itest/databindings/jaxb-top-down/src/main/resources/wsdl/wrapped/hello-service.wsdl
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/itest/databindings/jaxb-top-down/src/main/resources/wsdl/wrapped/hello-service.wsdl?rev=963624&r1=963623&r2=963624&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/itest/databindings/jaxb-top-down/src/main/resources/wsdl/wrapped/hello-service.wsdl (original)
+++ tuscany/sca-java-2.x/trunk/itest/databindings/jaxb-top-down/src/main/resources/wsdl/wrapped/hello-service.wsdl Tue Jul 13 09:12:08 2010
@@ -28,7 +28,8 @@
     xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
     xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
     <wsdl:types>
-        <xs:schema targetNamespace="http://util.java/"
+        <!-- <xs:schema targetNamespace="http://util.java/" -->
+        <xs:schema targetNamespace=""
             version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
             <xs:complexType name="arrayList">
                 <xs:complexContent>

Modified: tuscany/sca-java-2.x/trunk/itest/interfaces/src/main/java/org/apache/tuscany/sca/itest/interfaces/LocalClientComponent.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/itest/interfaces/src/main/java/org/apache/tuscany/sca/itest/interfaces/LocalClientComponent.java?rev=963624&r1=963623&r2=963624&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/itest/interfaces/src/main/java/org/apache/tuscany/sca/itest/interfaces/LocalClientComponent.java (original)
+++ tuscany/sca-java-2.x/trunk/itest/interfaces/src/main/java/org/apache/tuscany/sca/itest/interfaces/LocalClientComponent.java Tue Jul 13 09:12:08 2010
@@ -28,11 +28,11 @@ public interface LocalClientComponent {
 
     String foo1(ParameterObject po);
 
-    String foo1(String str) throws Exception;
+    String foo2(String str) throws Exception;
 
-    String foo2(String str, int i);
+    String foo3(String str, int i);
 
-    String foo2(int i, String str) throws Exception;
+    String foo4(int i, String str) throws Exception;
 
     void callback(String str);
 

Modified: tuscany/sca-java-2.x/trunk/itest/interfaces/src/main/java/org/apache/tuscany/sca/itest/interfaces/LocalClientComponentImpl.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/itest/interfaces/src/main/java/org/apache/tuscany/sca/itest/interfaces/LocalClientComponentImpl.java?rev=963624&r1=963623&r2=963624&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/itest/interfaces/src/main/java/org/apache/tuscany/sca/itest/interfaces/LocalClientComponentImpl.java (original)
+++ tuscany/sca-java-2.x/trunk/itest/interfaces/src/main/java/org/apache/tuscany/sca/itest/interfaces/LocalClientComponentImpl.java Tue Jul 13 09:12:08 2010
@@ -35,15 +35,15 @@ public class LocalClientComponentImpl im
         return "AComponent";
     }
 
-    public String foo1(String str) throws Exception {
+    public String foo2(String str) throws Exception {
         return str + "AComponent";
     }
 
-    public String foo2(String str, int i) {
+    public String foo3(String str, int i) {
         return str + "AComponent" + i;
     }
 
-    public String foo2(int i, String str) throws Exception {
+    public String foo4(int i, String str) throws Exception {
         return str + "AComponent" + i;
     }
 

Modified: tuscany/sca-java-2.x/trunk/itest/interfaces/src/test/java/org/apache/tuscany/sca/itest/interfaces/InterfacesTestCase.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/itest/interfaces/src/test/java/org/apache/tuscany/sca/itest/interfaces/InterfacesTestCase.java?rev=963624&r1=963623&r2=963624&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/itest/interfaces/src/test/java/org/apache/tuscany/sca/itest/interfaces/InterfacesTestCase.java (original)
+++ tuscany/sca-java-2.x/trunk/itest/interfaces/src/test/java/org/apache/tuscany/sca/itest/interfaces/InterfacesTestCase.java Tue Jul 13 09:12:08 2010
@@ -60,10 +60,10 @@ public class InterfacesTestCase {
             assertEquals("AComponent", local.foo1(po));
             assertEquals("AComponent", po.field1);
 
-            assertEquals("AAComponent", local.foo1("A"));
+            assertEquals("AAComponent", local.foo2("A"));
 
-            assertEquals("AAComponent1", local.foo2("A", 1));
-            assertEquals("AAComponent1", local.foo2(1, "A"));
+            assertEquals("AAComponent1", local.foo3("A", 1));
+            assertEquals("AAComponent1", local.foo4(1, "A"));
         } catch (Exception e) {
             fail();
         }

Modified: tuscany/sca-java-2.x/trunk/itest/jms/format-jmsobject/src/main/resources/jmsobject/helloworld.composite
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/itest/jms/format-jmsobject/src/main/resources/jmsobject/helloworld.composite?rev=963624&r1=963623&r2=963624&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/itest/jms/format-jmsobject/src/main/resources/jmsobject/helloworld.composite (original)
+++ tuscany/sca-java-2.x/trunk/itest/jms/format-jmsobject/src/main/resources/jmsobject/helloworld.composite Tue Jul 13 09:12:08 2010
@@ -42,7 +42,6 @@
     <component name="HelloWorldServiceComponent1">
         <implementation.java class="org.apache.tuscany.sca.binding.jms.format.jmsobject.helloworld.HelloWorldServiceImpl" />
         <service name="HelloWorldService">
-            <interface.wsdl interface="http://helloworld.jmsobject.format.jms.binding.sca.tuscany.apache.org/#wsdl.interface(HelloWorldService)"/>
             <binding.jms>
                 <tuscany:wireFormat.jmsObject wrapSingle="true"/>
                 <destination jndiName="HelloWorldService1"/>

Modified: tuscany/sca-java-2.x/trunk/itest/jms/format-jmstextxml/src/main/resources/jmstextxml/helloworld.wsdl
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/itest/jms/format-jmstextxml/src/main/resources/jmstextxml/helloworld.wsdl?rev=963624&r1=963623&r2=963624&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/itest/jms/format-jmstextxml/src/main/resources/jmstextxml/helloworld.wsdl (original)
+++ tuscany/sca-java-2.x/trunk/itest/jms/format-jmstextxml/src/main/resources/jmstextxml/helloworld.wsdl Tue Jul 13 09:12:08 2010
@@ -65,7 +65,13 @@
                 </complexType>
             </element>
 
-            <element name="CheckedException" type="xsd:string" />
+            <element name="CheckedException" type="CheckedException" />
+            
+            <complexType name="CheckedException">
+                <sequence>
+                    <element minOccurs="0" name="message" type="xsd:string" />
+                </sequence>
+            </complexType>
 
         </schema>
         

Modified: tuscany/sca-java-2.x/trunk/itest/ws/wsdl/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/CustomerProfileData.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/itest/ws/wsdl/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/CustomerProfileData.java?rev=963624&r1=963623&r2=963624&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/itest/ws/wsdl/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/CustomerProfileData.java (original)
+++ tuscany/sca-java-2.x/trunk/itest/ws/wsdl/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/CustomerProfileData.java Tue Jul 13 09:12:08 2010
@@ -33,6 +33,16 @@ public class CustomerProfileData {
     private String loginID;
     private String password;
     private int id;
+    
+    public CustomerProfileData() {
+        firstName = "John";
+        lastName = "Doe";
+        address = "345 Main Street";
+        email = "john@doe.org";
+        this.loginID = "DefaultloginID";
+        password = "hello";
+        id = 1234;
+    }
 
     public CustomerProfileData(String loginID) {
         firstName = "John";

Modified: tuscany/sca-java-2.x/trunk/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/customerdata.xsd
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/customerdata.xsd?rev=963624&r1=963623&r2=963624&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/customerdata.xsd (original)
+++ tuscany/sca-java-2.x/trunk/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/customerdata.xsd Tue Jul 13 09:12:08 2010
@@ -21,7 +21,7 @@
             targetNamespace="http://accounts"
             xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 
-    <xsd:complexType name="CustomerProfileData">
+    <xsd:complexType name="customerProfileData">
         <xsd:sequence>
             <xsd:element name="firstName" type="xsd:string" />
             <xsd:element name="lastName" type="xsd:string" />

Modified: tuscany/sca-java-2.x/trunk/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/questionmark-include.wsdl
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/questionmark-include.wsdl?rev=963624&r1=963623&r2=963624&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/questionmark-include.wsdl (original)
+++ tuscany/sca-java-2.x/trunk/itest/ws/wsdl/src/main/resources/org/apache/tuscany/sca/binding/ws/axis2/questionmark-include.wsdl Tue Jul 13 09:12:08 2010
@@ -44,11 +44,7 @@
                 <xsd:complexType>
                     <xsd:sequence>
                         <xsd:element name="customerProfile"
-                            type="xsd:string" />
-                        <!--
-                        <xsd:element name="customerProfile"
-                            type="account:CustomerProfileData" />
-                        -->
+                            type="account:customerProfileData" />
                     </xsd:sequence>
                 </xsd:complexType>
             </xsd:element>

Modified: tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/BuilderExtensionPoint.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/BuilderExtensionPoint.java?rev=963624&r1=963623&r2=963624&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/BuilderExtensionPoint.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/BuilderExtensionPoint.java Tue Jul 13 09:12:08 2010
@@ -33,6 +33,28 @@ import org.apache.tuscany.sca.assembly.I
  * @tuscany.spi.extension.asclient
  */
 public interface BuilderExtensionPoint {
+    
+    /**
+     * Adds a contract builder.
+     * 
+     * @param compositeBuilder
+     */
+    void addContractBuilder(ContractBuilder contractBuilder);
+
+    /**
+     * Removes a contract builder.
+     *  
+     * @param compositeBuilder
+     */
+    void removeContractBuilder(ContractBuilder contractBuilder);
+
+    /**
+     * Returns the contract builder
+     * 
+     * @param id
+     * @return
+     */
+    ContractBuilder getContractBuilder();    
 
     /**
      * Adds a composite builder.

Added: tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/ContractBuilder.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/ContractBuilder.java?rev=963624&view=auto
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/ContractBuilder.java (added)
+++ tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/ContractBuilder.java Tue Jul 13 09:12:08 2010
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+
+package org.apache.tuscany.sca.assembly.builder;
+
+import org.apache.tuscany.sca.assembly.Endpoint;
+import org.apache.tuscany.sca.assembly.EndpointReference;
+import org.apache.tuscany.sca.interfacedef.InterfaceContract;
+
+/**
+ * A builder that builds WSDL versions of component contracts so that the
+ * component contracts can be compared with binding contracts in a generic way.
+ * The generic interface format defined by the Assembly spec is WSDL 1.1
+ */
+public interface ContractBuilder {
+      
+    /**
+     * Build the WSDL version of the Interface Contract
+     */
+    boolean build(InterfaceContract interfaceContract, BuilderContext context);    
+}

Modified: tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/DefaultBuilderExtensionPoint.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/DefaultBuilderExtensionPoint.java?rev=963624&r1=963623&r2=963624&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/DefaultBuilderExtensionPoint.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/DefaultBuilderExtensionPoint.java Tue Jul 13 09:12:08 2010
@@ -41,6 +41,7 @@ import org.apache.tuscany.sca.core.Utili
 import org.apache.tuscany.sca.extensibility.ServiceDeclaration;
 import org.apache.tuscany.sca.extensibility.ServiceDeclarationParser;
 import org.apache.tuscany.sca.extensibility.ServiceDiscovery;
+import org.apache.tuscany.sca.interfacedef.InterfaceContract;
 import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper;
 
 /**
@@ -56,6 +57,7 @@ public class DefaultBuilderExtensionPoin
     private final Map<QName, ImplementationBuilder> implementationBuilders =
         new HashMap<QName, ImplementationBuilder>();
     private final Map<QName, PolicyBuilder> policyBuilders = new HashMap<QName, PolicyBuilder>();
+    private ContractBuilder contractBuilder  = null;
 
     private boolean loaded;
 
@@ -85,6 +87,19 @@ public class DefaultBuilderExtensionPoin
         loadBuilders();
         return builders.get(id);
     }
+    
+    public void addContractBuilder(ContractBuilder contractBuilder){ 
+        this.contractBuilder = contractBuilder;
+    }
+
+    public void removeContractBuilder(ContractBuilder contractBuilder){
+        this.contractBuilder = null;
+    }
+
+    public ContractBuilder getContractBuilder(){
+        loadBuilders();
+        return contractBuilder;
+    }
 
     /**
      * Load builders declared under META-INF/services.
@@ -147,6 +162,16 @@ public class DefaultBuilderExtensionPoin
             PolicyBuilder<?> builder = new LazyPolicyBuilder(builderDeclaration);
             policyBuilders.put(builder.getPolicyType(), builder);
         }
+        
+        try {
+            builderDeclarations = serviceDiscovery.getServiceDeclarations(ContractBuilder.class);
+        } catch (Exception e) {
+            throw new IllegalStateException(e);
+        }
+        
+        for (ServiceDeclaration builderDeclaration : builderDeclarations) {
+            contractBuilder = new LazyContractBuilder(builderDeclaration);
+        }
 
 
         loaded = true;
@@ -405,4 +430,50 @@ public class DefaultBuilderExtensionPoin
             return getBuilder().build(endpointReference, endpoint, context);
         }      
     }
+    
+    private class LazyContractBuilder implements ContractBuilder {
+        private ServiceDeclaration sd;
+        private ContractBuilder builder;
+
+        /**
+         * @param sd
+         */
+        public LazyContractBuilder(ServiceDeclaration sd) {
+            super();
+            this.sd = sd;
+        }
+        
+/*        
+        public boolean build(EndpointReference endpointReference, BuilderContext context){
+            return getBuilder().build(endpointReference, context);
+        }
+        
+        public boolean build(Endpoint endpoint, BuilderContext context){
+            return getBuilder().build(endpoint, context);
+        }
+*/        
+        
+        public boolean build(InterfaceContract interfaceContract, BuilderContext context){
+            return getBuilder().build(interfaceContract, context);
+        }        
+        
+        private synchronized ContractBuilder getBuilder() {
+            if (builder == null) {
+                try {
+                    Class<?> builderClass = sd.loadClass();
+                    try {
+                        Constructor<?> constructor = builderClass.getConstructor(ExtensionPointRegistry.class);
+                        builder = (ContractBuilder)constructor.newInstance(registry);
+                    } catch (NoSuchMethodException e) {
+                        Constructor<?> constructor = builderClass.getConstructor();
+                        builder = (ContractBuilder)constructor.newInstance();
+
+                    }
+                } catch (Exception e) {
+                    throw new IllegalStateException(e);
+                }
+            }
+            return builder;
+        } 
+    }    
 }

Modified: tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/EndpointImpl.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/EndpointImpl.java?rev=963624&r1=963623&r2=963624&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/EndpointImpl.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/EndpointImpl.java Tue Jul 13 09:12:08 2010
@@ -26,6 +26,8 @@ import org.apache.tuscany.sca.assembly.C
 import org.apache.tuscany.sca.assembly.ComponentService;
 import org.apache.tuscany.sca.assembly.Endpoint;
 import org.apache.tuscany.sca.assembly.EndpointReference;
+import org.apache.tuscany.sca.assembly.builder.BuilderExtensionPoint;
+import org.apache.tuscany.sca.assembly.builder.ContractBuilder;
 import org.apache.tuscany.sca.core.ExtensionPointRegistry;
 import org.apache.tuscany.sca.interfacedef.InterfaceContract;
 import org.apache.tuscany.sca.policy.ExtensionType;
@@ -42,6 +44,8 @@ public class EndpointImpl implements End
     private static final long serialVersionUID = 7344399683703812593L;
 
     protected transient ExtensionPointRegistry registry;
+    protected transient BuilderExtensionPoint builders;
+    protected transient ContractBuilder contractBuilder; 
     protected boolean unresolved;
     protected String uri;
     protected Component component;

Modified: tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/EndpointReferenceImpl.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/EndpointReferenceImpl.java?rev=963624&r1=963623&r2=963624&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/EndpointReferenceImpl.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/impl/EndpointReferenceImpl.java Tue Jul 13 09:12:08 2010
@@ -26,6 +26,8 @@ import org.apache.tuscany.sca.assembly.C
 import org.apache.tuscany.sca.assembly.ComponentReference;
 import org.apache.tuscany.sca.assembly.Endpoint;
 import org.apache.tuscany.sca.assembly.EndpointReference;
+import org.apache.tuscany.sca.assembly.builder.BuilderExtensionPoint;
+import org.apache.tuscany.sca.assembly.builder.ContractBuilder;
 import org.apache.tuscany.sca.core.ExtensionPointRegistry;
 import org.apache.tuscany.sca.interfacedef.InterfaceContract;
 import org.apache.tuscany.sca.policy.ExtensionType;
@@ -41,7 +43,9 @@ import org.apache.tuscany.sca.policy.Pol
 public class EndpointReferenceImpl implements EndpointReference {
     private static final long serialVersionUID = 8838066441709300972L;
 
-    protected ExtensionPointRegistry registry;
+    protected transient ExtensionPointRegistry registry;
+    protected transient BuilderExtensionPoint builders;
+    protected transient ContractBuilder contractBuilder;    
     protected boolean unresolved = true;
     protected String uri;
     protected Component component;

Modified: tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/interfacedef/InterfaceContract.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/interfacedef/InterfaceContract.java?rev=963624&r1=963623&r2=963624&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/interfacedef/InterfaceContract.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/interfacedef/InterfaceContract.java Tue Jul 13 09:12:08 2010
@@ -78,5 +78,23 @@ public interface InterfaceContract exten
      * Implementations must support cloning.
      */
     Object clone() throws CloneNotSupportedException;
+    
+    /**
+     * For matching purposes the Java interface contract is 
+     * turned into a WSDL contract in the cases where it needs to be matched
+     * against another WSDL contract
+     * 
+     * @return WSDL interface contract
+     */
+    InterfaceContract getNormalizedWSDLContract();
+    
+    /**
+     * For matching purposes the Java interface contract is 
+     * turned into a WSDL contract in the cases where it needs to be matched
+     * against another WSDL contract
+     * 
+     * @param wsdlInterfaceContract
+     */
+    void setNormailizedWSDLContract(InterfaceContract wsdlInterfaceContract);    
 
 }

Modified: tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/interfacedef/impl/InterfaceContractImpl.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/interfacedef/impl/InterfaceContractImpl.java?rev=963624&r1=963623&r2=963624&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/interfacedef/impl/InterfaceContractImpl.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/interfacedef/impl/InterfaceContractImpl.java Tue Jul 13 09:12:08 2010
@@ -125,5 +125,18 @@ public abstract class InterfaceContractI
         }
         return true;
     }
+    
+    // By default there is no normailized contract
+    // as only Java needs it
+    public InterfaceContract getNormalizedWSDLContract() {
+        return null;
+    }
+    
+    // By default there is no normailized contract
+    // as only Java needs it
+    public void setNormailizedWSDLContract(
+            InterfaceContract wsdlInterfaceContract) {
+        // do nothing
+    }
 
 }

Modified: tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/interfacedef/impl/InterfaceContractMapperImpl.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/interfacedef/impl/InterfaceContractMapperImpl.java?rev=963624&r1=963623&r2=963624&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/interfacedef/impl/InterfaceContractMapperImpl.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/assembly/src/main/java/org/apache/tuscany/sca/interfacedef/impl/InterfaceContractMapperImpl.java Tue Jul 13 09:12:08 2010
@@ -21,6 +21,11 @@ package org.apache.tuscany.sca.interface
 
 import java.util.List;
 
+import javax.xml.namespace.QName;
+
+import org.apache.tuscany.sca.assembly.builder.BuilderExtensionPoint;
+import org.apache.tuscany.sca.assembly.builder.ContractBuilder;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
 import org.apache.tuscany.sca.interfacedef.Compatibility;
 import org.apache.tuscany.sca.interfacedef.DataType;
 import org.apache.tuscany.sca.interfacedef.IncompatibleInterfaceContractException;
@@ -28,27 +33,95 @@ import org.apache.tuscany.sca.interfaced
 import org.apache.tuscany.sca.interfacedef.InterfaceContract;
 import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper;
 import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.interfacedef.util.XMLType;
+import org.apache.tuscany.sca.policy.ExtensionType;
 
 /**
  * @version $Rev$ $Date$
  */
 public class InterfaceContractMapperImpl implements InterfaceContractMapper {
-
+    
+    protected ExtensionPointRegistry registry;
+    protected BuilderExtensionPoint builders;
+    protected ContractBuilder contractBuilder;
+    
+    public InterfaceContractMapperImpl(ExtensionPointRegistry registry){
+        this.registry = registry;
+        this.builders = registry.getExtensionPoint(BuilderExtensionPoint.class);
+    }
+    
     public boolean isCompatible(DataType source, DataType target, boolean passByValue) {
+        return isCompatible(source, target, passByValue, null);   
+    }
+
+    public boolean isCompatible(DataType source, DataType target, boolean passByValue, StringBuffer audit) {
         if (source == target) {
             return true;
         }
         if (!passByValue) {
             if (source == null || target == null) {
+                if (audit != null){
+                    audit.append("One of either the source or target data types is null for");
+                }
                 return false;
             }
             // For local case
             return target.getPhysical().isAssignableFrom(source.getPhysical());
         } else {
-            // FIXME: [rfeng] How to test if two remotable data type is compatible?
-            // We will need to understand the different typing system used by the databindings
-            // We should probably delegate to some extensions here
-            return true;
+            // For remote interfaces where the target is represented with WSDL 
+            // the source will have been converted to WSDL so we rely on JAXB mappings
+            // being the same in both cases and just compare the type names directly. 
+            // TODO - is this right?
+            XMLType sourceLogicalType = null;
+            
+            // There is some nesting of data types (when GeneratedDataType is used) so
+            // dig a bit deeper to find the real data type
+            if (source.getLogical() instanceof DataType<?>){
+                sourceLogicalType = (XMLType)((DataType<?>)source.getLogical()).getLogical();
+            } else {
+                sourceLogicalType = (XMLType)source.getLogical();
+            }
+            
+            XMLType targetLogicalType = null; 
+            
+            if (target.getLogical() instanceof DataType<?>){
+                targetLogicalType = (XMLType)((DataType<?>)target.getLogical()).getLogical();
+            } else {
+                targetLogicalType = (XMLType)target.getLogical();
+            }
+            
+            // The logical type seems to be null in some cases, e.g. when the 
+            // argument or return type is something like a Map. 
+            // TODO - check when some type give rise to a null logical type
+            if (sourceLogicalType.getTypeName() == null ||
+                targetLogicalType.getTypeName() == null) {
+                return true;
+            }
+            
+            boolean match = sourceLogicalType.getTypeName().equals(targetLogicalType.getTypeName());
+            
+            if (!match){
+                
+                QName anyType = new QName("http://www.w3.org/2001/XMLSchema", "anyType");
+                if (sourceLogicalType.getTypeName().equals(anyType) || 
+                    targetLogicalType.getTypeName().equals(anyType)){
+                    // special case where a Java interface uses a generic type, e.g.
+                    // public OMElement getGreetings(OMElement om)
+                    // while the provided WSDL uses a specific type. So we assume
+                    // that xsd:anyType matched anything
+                    match = true;
+                } else {
+                    if (audit != null){
+                        audit.append("Operation argument types source = " + 
+                                     sourceLogicalType.getTypeName() + 
+                                     " target = " + 
+                                     targetLogicalType.getTypeName() +
+                                     " don't match for");
+                    }
+                }
+            }
+            
+            return match; 
         }
 
     }
@@ -62,6 +135,9 @@ public class InterfaceContractMapperImpl
      * @return
      */
     public boolean isMutuallyCompatible(InterfaceContract source, InterfaceContract target) {
+        ExtensionType ext = source.getInterface().getExtensionType();
+        InterfaceContract sourceContract = null;
+        
         // Are the forward interfaces equal?
         if (isMutuallyCompatible(source.getInterface(), target.getInterface())) {
             // Is there a Callback interface?
@@ -120,6 +196,10 @@ public class InterfaceContractMapperImpl
     }
 
     public boolean isCompatible(Operation source, Operation target, Compatibility compatibilityType, boolean byValue) {
+        return isCompatible(source, target, compatibilityType, true, null);
+    }
+    
+    public boolean isCompatible(Operation source, Operation target, Compatibility compatibilityType, boolean byValue, StringBuffer audit) {
         if (source == target) {
             return true;
         }
@@ -130,10 +210,22 @@ public class InterfaceContractMapperImpl
 
         // Check name
         if (!source.getName().equals(target.getName())) {
+            if (audit != null){
+                audit.append("operation names are not the same source = " +
+                             source.getName() + 
+                             " target = " +
+                             target.getName());
+            }
             return false;
         }
 
         if (source.getInterface().isRemotable() != target.getInterface().isRemotable()) {
+            if (audit != null){
+                audit.append("Interfaces have different remote settings source = " +
+                             source.getName() + 
+                             " target = " +
+                             target.getName());
+            }            
             return false;
         }
 
@@ -164,21 +256,32 @@ public class InterfaceContractMapperImpl
             checkTargetWrapper = false;
         }
 
+/* TODO - Why are we assuming compatibility if one side is wrapped and the other is not?
         if (checkSourceWrapper != checkTargetWrapper) {
             return true;
         }
+*/
 
-        if (!isCompatible(targetOutputType, sourceOutputType, passByValue)) {
+        if (!isCompatible(targetOutputType, sourceOutputType, passByValue, audit)) {
+            if (audit != null){
+                audit.append(" output types");
+            } 
             return false;
         }
 
         if (sourceInputType.size() != targetInputType.size()) {
+            if (audit != null){
+                audit.append("different number of input types");
+            } 
             return false;
         }
 
         int size = sourceInputType.size();
         for (int i = 0; i < size; i++) {
-            if (!isCompatible(sourceInputType.get(i), targetInputType.get(i), passByValue)) {
+            if (!isCompatible(sourceInputType.get(i), targetInputType.get(i), passByValue, audit)) {
+                if (audit != null){
+                    audit.append(" input types");
+                } 
                 return false;
             }
         }
@@ -190,13 +293,16 @@ public class InterfaceContractMapperImpl
             boolean found = true;
             for (DataType sourceFaultType : source.getFaultTypes()) {
                 found = false;
-                if (isCompatible(targetFaultType, sourceFaultType, passByValue)) {
+                if (isCompatible(targetFaultType, sourceFaultType, passByValue, audit)) {
                     // Target fault type can be covered by the source fault type
                     found = true;
                     break;
                 }
             }
             if (!found) {
+                if (audit != null){
+                    audit.append("Fault types incompatible");
+                } 
                 return false;
             }
         }
@@ -226,6 +332,7 @@ public class InterfaceContractMapperImpl
                                       Compatibility compatibility,
                                       boolean ignoreCallback,
                                       boolean silent) throws IncompatibleInterfaceContractException {
+      
         if (source == target) {
             // Shortcut for performance
             return true;
@@ -268,18 +375,20 @@ public class InterfaceContractMapperImpl
                     return false;
                 }
             }
-            if (!source.getInterface().isRemotable()) {
-                // FIXME: for remotable operation, only compare name for now
+            
+            if (!silent) {
+                StringBuffer audit = new StringBuffer();
+                if (!isCompatible(operation, targetOperation, Compatibility.SUBSET, true, audit)){
+                    throw new IncompatibleInterfaceContractException("Operations called " +
+                                                                     operation.getName() +
+                                                                     " are not compatible " + 
+                                                                     audit,
+                                                                     source, 
+                                                                     target);
+                }
+            } else {
                 if (!isCompatible(operation, targetOperation, Compatibility.SUBSET)) {
-                    if (!silent) {
-                        throw new IncompatibleInterfaceContractException("Target operations called " +
-                                                                         operation.getName() +
-                                                                         " are not compatible",
-                                                                         source, 
-                                                                         target);
-                    } else {
-                        return false;
-                    }
+                    return false;
                 }
             }
         }
@@ -294,7 +403,7 @@ public class InterfaceContractMapperImpl
         }
         if (source.getCallbackInterface() == null || target.getCallbackInterface() == null) {
             if (!silent) {
-                throw new IncompatibleInterfaceContractException("Callback interface doesn't match", source, target);
+                throw new IncompatibleInterfaceContractException("Callback interface doesn't match as one of the callback interfaces is null", source, target);
             } else {
                 return false;
             }
@@ -386,7 +495,30 @@ public class InterfaceContractMapperImpl
             }
             return null;
         }
-
     }
+   
+    /**
+     * In various places in the process of an SCA application we match one interface against
+     * another. Sometimes the two interfaces can be presented using different IDLs, for example
+     * Java and WSDL. In this case interfaces are converted so that they are both WSDL1.1 interfaces
+     * and they are then compared. The generated WSDL is cached on the interface object for 
+     * any subsequent matching
+     * 
+     * @param interfaceA
+     * @param interfaceB
+     */
+/*    
+    public void normalizeContractsForComparison(InterfaceContract interfaceA, InterfaceContract interfaceB){
+        // normalize interfaces
+        if (interfaceA.getInterface().getClass() != interfaceB.getInterface().getClass()) {
+            this.contractBuilder = builders.getContractBuilder();
+            if (interfaceA.getInterface() instanceof Interface){
+                contractBuilder.build(interfaceA, null);
+            } else {
+                contractBuilder.build(interfaceB, null);
+            }            
+        }
+    }
+*/
 
 }

Modified: tuscany/sca-java-2.x/trunk/modules/assembly/src/main/resources/org/apache/tuscany/sca/assembly/builder/assembly-validation-messages.properties
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/assembly/src/main/resources/org/apache/tuscany/sca/assembly/builder/assembly-validation-messages.properties?rev=963624&r1=963623&r2=963624&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/assembly/src/main/resources/org/apache/tuscany/sca/assembly/builder/assembly-validation-messages.properties (original)
+++ tuscany/sca-java-2.x/trunk/modules/assembly/src/main/resources/org/apache/tuscany/sca/assembly/builder/assembly-validation-messages.properties Tue Jul 13 09:12:08 2010
@@ -79,3 +79,5 @@ CompositeReferencePromotesNonOverridable
 PropertyValueDoesNotMatchSimpleType = [ASM50027] The property {0} on component {1} has a value which does not match the simple type {2} with which it is associated
 PropertyValueDoesNotMatchComplexType = [ASM50038] The property {0} on component {1} has a value which does not match the complex type {2} with which it is associated. Validation reported {3}
 PropertyValueDoesNotMatchElement = [ASM50029] The property {0} on component {1} has a value which does not match the element {2} with which it is associated. Validation reported {3}
+EPRIncompatibleInterface = [BWS20007] The reference interface is incompatible with the interface of the reference binding {0}
+EPIncompatibleInterface = [BWS20007] The service interface is incompatible with the interface of the service binding {0}

Modified: tuscany/sca-java-2.x/trunk/modules/binding-corba-runtime/src/test/java/org/apache/tuscany/sca/binding/corba/testing/service/mocks/TestInterfaceContract.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/binding-corba-runtime/src/test/java/org/apache/tuscany/sca/binding/corba/testing/service/mocks/TestInterfaceContract.java?rev=963624&r1=963623&r2=963624&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/binding-corba-runtime/src/test/java/org/apache/tuscany/sca/binding/corba/testing/service/mocks/TestInterfaceContract.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/binding-corba-runtime/src/test/java/org/apache/tuscany/sca/binding/corba/testing/service/mocks/TestInterfaceContract.java Tue Jul 13 09:12:08 2010
@@ -54,5 +54,18 @@ public class TestInterfaceContract imple
     public Object clone() {
         return null;
     }
+    
+    // By default there is no normailized contract
+    // as only Java needs it
+    public InterfaceContract getNormalizedWSDLContract() {
+        return null;
+    }
+    
+    // By default there is no normailized contract
+    // as only Java needs it
+    public void setNormailizedWSDLContract(
+            InterfaceContract wsdlInterfaceContract) {
+        // do nothing
+    }
 
 }

Modified: tuscany/sca-java-2.x/trunk/modules/binding-corba-runtime/src/test/java/org/apache/tuscany/sca/binding/corba/testing/service/mocks/TestRuntimeWire.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/binding-corba-runtime/src/test/java/org/apache/tuscany/sca/binding/corba/testing/service/mocks/TestRuntimeWire.java?rev=963624&r1=963623&r2=963624&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/binding-corba-runtime/src/test/java/org/apache/tuscany/sca/binding/corba/testing/service/mocks/TestRuntimeWire.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/binding-corba-runtime/src/test/java/org/apache/tuscany/sca/binding/corba/testing/service/mocks/TestRuntimeWire.java Tue Jul 13 09:12:08 2010
@@ -288,5 +288,18 @@ public class TestRuntimeWire implements 
         // TODO Auto-generated method stub
         
     }
+    
+    public void setGeneratedWSDLContract(InterfaceContract wsdlContract){
+        
+    }
+    
+    public InterfaceContract getGeneratedWSDLContract(){
+        return null;
+    }
+    
+    public void validateServiceInterfaceCompatibility() {
+        // TODO Auto-generated method stub
+        
+    }
 
 }

Modified: tuscany/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/BindingWSDLGenerator.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/BindingWSDLGenerator.java?rev=963624&r1=963623&r2=963624&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/BindingWSDLGenerator.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/BindingWSDLGenerator.java Tue Jul 13 09:12:08 2010
@@ -266,27 +266,64 @@ public class BindingWSDLGenerator {
     /**
      * Create a WSDLInterfaceContract from a JavaInterfaceContract
      */
-    protected static WSDLInterfaceContract createWSDLInterfaceContract(JavaInterfaceContract contract,
-                                                                       boolean requiresSOAP12,
-                                                                       ModelResolver resolver,
-                                                                       DataBindingExtensionPoint dataBindings,
-                                                                       WSDLFactory wsdlFactory,
-                                                                       XSDFactory xsdFactory,
-                                                                       DocumentBuilderFactory documentBuilderFactory, 
-                                                                       Monitor monitor) {
+    public static WSDLInterfaceContract createWSDLInterfaceContract(JavaInterfaceContract contract,
+                                                                    boolean requiresSOAP12,
+                                                                    ModelResolver resolver,
+                                                                    DataBindingExtensionPoint dataBindings,
+                                                                    WSDLFactory wsdlFactory,
+                                                                    XSDFactory xsdFactory,
+                                                                    DocumentBuilderFactory documentBuilderFactory, 
+                                                                    Monitor monitor) {
 
         WSDLInterfaceContract wsdlContract = wsdlFactory.createWSDLInterfaceContract();
-        WSDLInterface wsdlInterface = wsdlFactory.createWSDLInterface();
-        wsdlContract.setInterface(wsdlInterface);
+        
+        if (contract.getInterface() != null){
+            WSDLInterface wsdlInterface = createWSDLInterface((JavaInterface)contract.getInterface(),
+                                                               requiresSOAP12,
+                                                               resolver,
+                                                               dataBindings,
+                                                               wsdlFactory,
+                                                               xsdFactory,
+                                                               documentBuilderFactory, 
+                                                               monitor);
+            wsdlContract.setInterface(wsdlInterface);
+        }
+        
+        if (contract.getCallbackInterface() != null){
+            WSDLInterface wsdlInterface = createWSDLInterface((JavaInterface)contract.getCallbackInterface(),
+                    requiresSOAP12,
+                    resolver,
+                    dataBindings,
+                    wsdlFactory,
+                    xsdFactory,
+                    documentBuilderFactory, 
+                    monitor);
+            wsdlContract.setCallbackInterface(wsdlInterface);
+        }
 
+        return wsdlContract;
+    }
+    
+    /**
+     * Create a WSDLInterface from a JavaInterface
+     */
+    public static WSDLInterface createWSDLInterface(JavaInterface javaInterface,
+                                                    boolean requiresSOAP12,
+                                                    ModelResolver resolver,
+                                                    DataBindingExtensionPoint dataBindings,
+                                                    WSDLFactory wsdlFactory,
+                                                    XSDFactory xsdFactory,
+                                                    DocumentBuilderFactory documentBuilderFactory, 
+                                                    Monitor monitor) {
+
+        WSDLInterface wsdlInterface = wsdlFactory.createWSDLInterface();
         WSDLDefinition wsdlDefinition = wsdlFactory.createWSDLDefinition();
-        JavaInterface iface = (JavaInterface)contract.getInterface();
 
         Definition def = null;
         try {
             Interface2WSDLGenerator wsdlGenerator =
                 new Interface2WSDLGenerator(requiresSOAP12, resolver, dataBindings, xsdFactory, documentBuilderFactory, monitor);
-            def = wsdlGenerator.generate(iface, wsdlDefinition);
+            def = wsdlGenerator.generate(javaInterface, wsdlDefinition);
         } catch (WSDLException e) {
             throw new WSDLGenerationException(e);
         }
@@ -294,7 +331,7 @@ public class BindingWSDLGenerator {
         // for debugging
         if (printWSDL) {
             try {
-                System.out.println("Generated WSDL for Java interface " + iface.getName() + " class " + iface.getJavaClass().getName());
+                System.out.println("Generated WSDL for Java interface " + javaInterface.getName() + " class " + javaInterface.getJavaClass().getName());
                 WSDLWriter writer =  javax.wsdl.factory.WSDLFactory.newInstance().newWSDLWriter();
                 writer.writeWSDL(def, System.out);
             } catch (WSDLException e) {
@@ -316,7 +353,7 @@ public class BindingWSDLGenerator {
             throw new WSDLGenerationException(e);
         }
 
-        return wsdlContract;
-    }
+        return wsdlInterface;
+    }    
 
 }

Modified: tuscany/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/Interface2WSDLGenerator.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/Interface2WSDLGenerator.java?rev=963624&r1=963623&r2=963624&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/Interface2WSDLGenerator.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/Interface2WSDLGenerator.java Tue Jul 13 09:12:08 2010
@@ -797,10 +797,20 @@ public class Interface2WSDLGenerator {
             }
             helpers.put(db, helper);
         }
-        TypeInfo typeInfo = helper.getTypeInfo(javaType.isArray() ? javaType.getComponentType() : javaType,
-                                               dataType.getLogical());
-        ElementInfo element = new ElementInfo(name, typeInfo);
-        element.setMany(byte[].class != javaType && javaType.isArray());
+        // TUSCANY-3616 - don't revert a byte[] to a byte type but retain the mapping to base64Binary
+        //                which is carried in the dataType and the original javaType
+        TypeInfo typeInfo = null;
+        ElementInfo element = null;
+        if (byte[].class == javaType){
+            typeInfo = helper.getTypeInfo(javaType, dataType.getLogical());
+            element = new ElementInfo(name, typeInfo);
+            element.setMany(false);
+        } else {
+            typeInfo = helper.getTypeInfo(javaType.isArray() ? javaType.getComponentType() : javaType, dataType.getLogical());
+            element = new ElementInfo(name, typeInfo);
+            element.setMany(javaType.isArray());
+        }
+
         element.setNillable(!javaType.isPrimitive());
         return element;
     }

Added: tuscany/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLContractBuilder.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLContractBuilder.java?rev=963624&view=auto
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLContractBuilder.java (added)
+++ tuscany/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/src/main/java/org/apache/tuscany/sca/binding/ws/wsdlgen/WSDLContractBuilder.java Tue Jul 13 09:12:08 2010
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+
+package org.apache.tuscany.sca.binding.ws.wsdlgen;
+
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.apache.tuscany.sca.assembly.Component;
+import org.apache.tuscany.sca.assembly.Contract;
+import org.apache.tuscany.sca.assembly.Endpoint;
+import org.apache.tuscany.sca.assembly.EndpointReference;
+import org.apache.tuscany.sca.assembly.builder.BindingBuilder;
+import org.apache.tuscany.sca.assembly.builder.BuilderContext;
+import org.apache.tuscany.sca.assembly.builder.ContractBuilder;
+import org.apache.tuscany.sca.binding.ws.WebServiceBinding;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
+import org.apache.tuscany.sca.contribution.resolver.ResolverExtension;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.core.FactoryExtensionPoint;
+import org.apache.tuscany.sca.databinding.DataBindingExtensionPoint;
+import org.apache.tuscany.sca.interfacedef.InterfaceContract;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceContract;
+import org.apache.tuscany.sca.interfacedef.wsdl.WSDLFactory;
+import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterfaceContract;
+import org.apache.tuscany.sca.runtime.RuntimeEndpoint;
+import org.apache.tuscany.sca.runtime.RuntimeEndpointReference;
+import org.apache.tuscany.sca.xsd.XSDFactory;
+
+/**
+ * Created WSDL contracts for Endpoints or EndpointReferences for use during 
+ * interface contract mapping. The assmebly spec defines WSDL as the lowest
+ * common denominator for contract mapping. 
+ */
+public class WSDLContractBuilder implements ContractBuilder {
+
+    private ExtensionPointRegistry extensionPoints;
+    private FactoryExtensionPoint modelFactories;
+    private DataBindingExtensionPoint dataBindings;
+    private WSDLFactory wsdlFactory;
+    private XSDFactory xsdFactory;
+    private DocumentBuilderFactory documentBuilderFactory;
+
+    public WSDLContractBuilder(ExtensionPointRegistry extensionPoints) {
+        this.extensionPoints = extensionPoints;
+        
+        modelFactories = extensionPoints.getExtensionPoint(FactoryExtensionPoint.class);
+        dataBindings = extensionPoints.getExtensionPoint(DataBindingExtensionPoint.class);
+        wsdlFactory = modelFactories.getFactory(WSDLFactory.class);
+        xsdFactory = modelFactories.getFactory(XSDFactory.class);
+        documentBuilderFactory = modelFactories.getFactory(DocumentBuilderFactory.class);
+
+    }   
+    
+    public boolean build(InterfaceContract interfaceContract, BuilderContext context){
+// Uncomment the printWSDL =  lines to see the WSDL that is generated
+// for interface matching purposes
+//        BindingWSDLGenerator.printWSDL = true;
+        JavaInterfaceContract javaContract = (JavaInterfaceContract)interfaceContract;        
+        WSDLInterfaceContract wsdlContract = 
+            BindingWSDLGenerator.createWSDLInterfaceContract(javaContract, 
+                                                             false, 
+                                                             null,
+                                                             dataBindings, 
+                                                             wsdlFactory, 
+                                                             xsdFactory, 
+                                                             documentBuilderFactory, 
+                                                             null);
+        javaContract.setNormailizedWSDLContract(wsdlContract);
+//        BindingWSDLGenerator.printWSDL = false;
+        return true;
+    }
+
+}

Added: tuscany/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/src/main/resources/META-INF/services/org.apache.tuscany.sca.assembly.builder.ContractBuilder
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/src/main/resources/META-INF/services/org.apache.tuscany.sca.assembly.builder.ContractBuilder?rev=963624&view=auto
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/src/main/resources/META-INF/services/org.apache.tuscany.sca.assembly.builder.ContractBuilder (added)
+++ tuscany/sca-java-2.x/trunk/modules/binding-ws-wsdlgen/src/main/resources/META-INF/services/org.apache.tuscany.sca.assembly.builder.ContractBuilder Tue Jul 13 09:12:08 2010
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+# 
+#   http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License. 
+org.apache.tuscany.sca.binding.ws.wsdlgen.WSDLContractBuilder
+

Modified: tuscany/sca-java-2.x/trunk/modules/binding-ws/src/main/java/org/apache/tuscany/sca/binding/ws/impl/WebServiceBindingImpl.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/binding-ws/src/main/java/org/apache/tuscany/sca/binding/ws/impl/WebServiceBindingImpl.java?rev=963624&r1=963623&r2=963624&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/binding-ws/src/main/java/org/apache/tuscany/sca/binding/ws/impl/WebServiceBindingImpl.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/binding-ws/src/main/java/org/apache/tuscany/sca/binding/ws/impl/WebServiceBindingImpl.java Tue Jul 13 09:12:08 2010
@@ -73,10 +73,10 @@ class WebServiceBindingImpl implements W
     private String portName;
     private QName serviceName;
     private String endpointName;
-    private WSDLDefinition wsdlDefinition;
-    private String wsdlNamespace;
     private InterfaceContract bindingInterfaceContract;
     private Element endPointReference;
+    private String wsdlNamespace;
+    private WSDLDefinition userSpecifiedWSDLDefinition;
     private Definition generatedWSDLDocument;
     private boolean isDocumentStyle;
     private boolean isLiteralEncoding;
@@ -140,8 +140,8 @@ class WebServiceBindingImpl implements W
 
     public Binding getBinding() {
         if (binding == null) {
-            if (getUserSpecifiedWSDLDefinition() != null && wsdlDefinition.getBinding() != null) {
-                binding = wsdlDefinition.getBinding();
+            if (getUserSpecifiedWSDLDefinition() != null && userSpecifiedWSDLDefinition.getBinding() != null) {
+                binding = userSpecifiedWSDLDefinition.getBinding();
                 determineWSDLCharacteristics();
             }
         }
@@ -247,17 +247,17 @@ class WebServiceBindingImpl implements W
     }
 
     public WSDLDefinition getUserSpecifiedWSDLDefinition() {
-        if (wsdlDefinition == null) {
+        if (userSpecifiedWSDLDefinition == null) {
             Interface iface = bindingInterfaceContract.getInterface();
             if (iface instanceof WSDLInterface) {
-                wsdlDefinition = ((WSDLInterface) iface).getWsdlDefinition();
+                userSpecifiedWSDLDefinition = ((WSDLInterface) iface).getWsdlDefinition();
             }
         }
-        return wsdlDefinition;
+        return userSpecifiedWSDLDefinition;
     }
 
     public void setUserSpecifiedWSDLDefinition(WSDLDefinition wsdlDefinition) {
-        this.wsdlDefinition = wsdlDefinition;
+        this.userSpecifiedWSDLDefinition = wsdlDefinition;
     }
 
     public String getNamespace() {
@@ -335,7 +335,7 @@ class WebServiceBindingImpl implements W
     }   
     
     /**
-     * Some items get calculated and cached as they are used are runtime
+     * Some items get calculated and cached as they are used at runtime
      * to decide what message processing is required
      */
     protected void determineWSDLCharacteristics() {
@@ -347,8 +347,8 @@ class WebServiceBindingImpl implements W
     protected void setIsDocumentStyle() {
         
         if (binding == null){
-            if (wsdlDefinition != null && wsdlDefinition.getDefinition() != null){
-                Message firstMessage = (Message)wsdlDefinition.getDefinition().getMessages().values().iterator().next();
+            if (userSpecifiedWSDLDefinition != null && userSpecifiedWSDLDefinition.getDefinition() != null){
+                Message firstMessage = (Message)userSpecifiedWSDLDefinition.getDefinition().getMessages().values().iterator().next();
                 Part firstPart = (Part)firstMessage.getParts().values().iterator().next();
                 if (firstPart.getTypeName() != null){
                     isDocumentStyle = false;

Modified: tuscany/sca-java-2.x/trunk/modules/builder/src/main/java/org/apache/tuscany/sca/builder/impl/ComponentBuilderImpl.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/builder/src/main/java/org/apache/tuscany/sca/builder/impl/ComponentBuilderImpl.java?rev=963624&r1=963623&r2=963624&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/builder/src/main/java/org/apache/tuscany/sca/builder/impl/ComponentBuilderImpl.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/builder/src/main/java/org/apache/tuscany/sca/builder/impl/ComponentBuilderImpl.java Tue Jul 13 09:12:08 2010
@@ -61,6 +61,7 @@ import org.apache.tuscany.sca.assembly.S
 import org.apache.tuscany.sca.assembly.Service;
 import org.apache.tuscany.sca.assembly.builder.BuilderContext;
 import org.apache.tuscany.sca.assembly.builder.BuilderExtensionPoint;
+import org.apache.tuscany.sca.assembly.builder.ContractBuilder;
 import org.apache.tuscany.sca.assembly.builder.ImplementationBuilder;
 import org.apache.tuscany.sca.assembly.builder.Messages;
 import org.apache.tuscany.sca.assembly.xsd.Constants;
@@ -75,9 +76,12 @@ import org.apache.tuscany.sca.definition
 import org.apache.tuscany.sca.interfacedef.Compatibility;
 import org.apache.tuscany.sca.interfacedef.DataType;
 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.impl.DataTypeImpl;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterface;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceContract;
 import org.apache.tuscany.sca.interfacedef.util.XMLType;
 import org.apache.tuscany.sca.monitor.Monitor;
 import org.apache.tuscany.sca.policy.ExtensionType;
@@ -106,6 +110,7 @@ public class ComponentBuilderImpl {
     private InterfaceContractMapper interfaceContractMapper;
     private BuilderExtensionPoint builders;
     private Mediator mediator;
+    private ContractBuilder contractBuilder;
 
     public ComponentBuilderImpl(ExtensionPointRegistry registry) {
         UtilityExtensionPoint utilities = registry.getExtensionPoint(UtilityExtensionPoint.class);
@@ -120,6 +125,7 @@ public class ComponentBuilderImpl {
         policyBuilder = new ComponentPolicyBuilderImpl(registry);
         builders = registry.getExtensionPoint(BuilderExtensionPoint.class);
         mediator = new MediatorImpl(registry);
+        contractBuilder = builders.getContractBuilder();
     }
 
     public void setComponentTypeBuilder(CompositeComponentTypeBuilderImpl componentTypeBuilder) {
@@ -1297,7 +1303,8 @@ public class ComponentBuilderImpl {
             boolean isCompatible = true;
             String incompatibilityReason = "";
             try{
-                isCompatible = interfaceContractMapper.checkCompatibility(topInterfaceContract, bottomInterfaceContract, Compatibility.SUBSET, false, false);
+                isCompatible = checkSubsetCompatibility(topInterfaceContract, 
+                                                        bottomInterfaceContract);
             } catch (IncompatibleInterfaceContractException ex){
                 isCompatible = false;
                 incompatibilityReason = ex.getMessage();
@@ -1311,6 +1318,24 @@ public class ComponentBuilderImpl {
                               topContract.getName(),
                               incompatibilityReason);
             }
+            
+            // TODO - there is an issue with the following code if the 
+            //        contracts of of different types. Need to use the 
+            //        normalized form
+            
+            // fix up the forward interface based on the promoted component
+            // Someone might have manually specified a callback interface but
+            // left out the forward interface
+            if (topInterfaceContract.getInterface() == null){
+                topInterfaceContract.setInterface(bottomInterfaceContract.getInterface());
+            }              
+            
+            // fix up the callback interface based on the promoted component
+            // Someone might have manually specified a forward interface but
+            // left out the callback interface
+            if (topInterfaceContract.getCallbackInterface() == null){
+                topInterfaceContract.setCallbackInterface(bottomInterfaceContract.getCallbackInterface());
+            }            
         }
     }
     
@@ -1337,7 +1362,8 @@ public class ComponentBuilderImpl {
             boolean isCompatible = true;
             String incompatibilityReason = "";
             try{
-                isCompatible = interfaceContractMapper.checkCompatibility(bottomInterfaceContract, topInterfaceContract, Compatibility.SUBSET, false, false);
+                isCompatible = checkSubsetCompatibility(bottomInterfaceContract, 
+                                                        topInterfaceContract);
             } catch (IncompatibleInterfaceContractException ex){
                 isCompatible = false;
                 incompatibilityReason = ex.getMessage();
@@ -1351,6 +1377,24 @@ public class ComponentBuilderImpl {
                               topContract.getName(),
                               incompatibilityReason);
             }
+            
+            // TODO - there is an issue with the following code if the 
+            //        contracts of of different types. Need to use the 
+            //        normalized form
+            
+            // fix up the forward interface based on the promoted component
+            // Someone might have manually specified a callback interface but
+            // left out the forward interface
+            if (topInterfaceContract.getInterface() == null){
+                topInterfaceContract.setInterface(bottomInterfaceContract.getInterface());
+            }            
+            
+            // fix up the callback interface based on the promoted component
+            // Someone might have manually specified a forward interface but
+            // left out the callback interface
+            if (topInterfaceContract.getCallbackInterface() == null){
+                topInterfaceContract.setCallbackInterface(bottomInterfaceContract.getCallbackInterface());
+            }            
         }
     }    
 
@@ -1418,6 +1462,43 @@ public class ComponentBuilderImpl {
         } else if (componentReference.getCallback().getBindings().isEmpty() && componentTypeReference.getCallback() != null) {
             componentReference.getCallback().getBindings().addAll(componentTypeReference.getCallback().getBindings());
         }
-    }    
+    }  
+    
+    /**
+     * A local wrapper for the interace contract mapper as we need to normalize the 
+     * interface contracts if appropriate and the mapper doesn't have the right
+     * dependencies to be able to do it. 
+     * 
+     * Sometimes the two interfaces can be presented using different IDLs, for example
+     * Java and WSDL. In this case interfaces are converted so that they are both WSDL1.1 interfaces
+     * and they are then compared. The generated WSDL is cached on the interface object for 
+     * any subsequent matching
+     * 
+     * @param contractA
+     * @param contractB
+     * @return true if the interface contracts match
+     */
+    private boolean checkSubsetCompatibility(InterfaceContract contractA, InterfaceContract contractB)
+        throws IncompatibleInterfaceContractException {
+        
+        if (contractA.getClass() != contractB.getClass()) {
+                      
+            if (contractA instanceof JavaInterfaceContract){
+                contractBuilder.build(contractA, null);
+                contractA = ((JavaInterfaceContract)contractA).getNormalizedWSDLContract();
+            } 
+            
+            if (contractB instanceof JavaInterfaceContract){
+                contractBuilder.build(contractB, null);
+                contractB = ((JavaInterfaceContract)contractB).getNormalizedWSDLContract();
+            }            
+        }   
+        
+        return interfaceContractMapper.checkCompatibility(contractA, 
+                                                          contractB, 
+                                                          Compatibility.SUBSET, 
+                                                          false, 
+                                                          false);
+    }
 
 }