From 99107098916fecc8c788f441452e9608037ae425 Mon Sep 17 00:00:00 2001 From: slaws Date: Wed, 18 Aug 2010 15:28:56 +0000 Subject: TUSCANY-3653 - Read JAXWS annotations in Java interfaces (JAXWSJavaIntefaceProcessor) and, in the JavaIntefaceProcessor, post process these to reconfigure the Java interface based on what is found. The case where WSDL is referenced is tricky and still has holes. The WSDL is read and is attached to the Java interface as a normalized interface and is used during interface matching. Binding implementations that care about WSDL should really check the normalized interface rather than the service interface itself. This is still a TODO. git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@986740 13f79535-47bb-0310-9956-ffa450edef68 --- .../core/assembly/impl/RuntimeEndpointImpl.java | 44 ++++++++++++++-------- .../impl/RuntimeEndpointReferenceImpl.java | 23 +++++++---- .../runtime/impl/EndpointReferenceBinderImpl.java | 27 ++++++++++--- 3 files changed, 66 insertions(+), 28 deletions(-) (limited to 'sca-java-2.x/trunk/modules/core/src/main/java') diff --git a/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeEndpointImpl.java b/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeEndpointImpl.java index e294f9c270..44dbeda11f 100644 --- a/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeEndpointImpl.java +++ b/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeEndpointImpl.java @@ -494,27 +494,39 @@ public class RuntimeEndpointImpl extends EndpointImpl implements RuntimeEndpoint InterfaceContract serviceContract = getComponentServiceInterfaceContract(); InterfaceContract bindingContract = getBindingInterfaceContract(); - + if ((serviceContract != null) && (bindingContract != null)){ boolean bindingHasCallback = bindingContract.getCallbackInterface() != null; try { - if ((serviceContract.getClass() != bindingContract.getClass()) && - (serviceContract instanceof JavaInterfaceContract)) { - interfaceContractMapper.checkCompatibility(getGeneratedWSDLContract(serviceContract), - bindingContract, - Compatibility.SUBSET, - !bindingHasCallback, // ignore callbacks if binding doesn't have one - false); - } else { - interfaceContractMapper.checkCompatibility(serviceContract, - bindingContract, - Compatibility.SUBSET, - !bindingHasCallback, // ignore callbacks if binding doesn't have one - false); - } +/* + interfaceContractMapper.checkCompatibility(getGeneratedWSDLContract(serviceContract), + getGeneratedWSDLContract(bindingContract), + Compatibility.SUBSET, + !bindingHasCallback, // ignore callbacks if binding doesn't have one + false); +*/ + + // Use the normalized contract if the interface types are different or if + // a normalized contract has been previously generate, for example, by virtue + // of finding a JAXWS annotation on a Java class that references a WSDL file + if (serviceContract.getClass() != bindingContract.getClass() || + serviceContract.getNormalizedWSDLContract() != null || + bindingContract.getNormalizedWSDLContract() != null) { + interfaceContractMapper.checkCompatibility(getGeneratedWSDLContract(serviceContract), + getGeneratedWSDLContract(bindingContract), + Compatibility.SUBSET, + !bindingHasCallback, // ignore callbacks if binding doesn't have one + false); + } else { + interfaceContractMapper.checkCompatibility(serviceContract, + bindingContract, + Compatibility.SUBSET, + !bindingHasCallback, // ignore callbacks if binding doesn't have one + false); + } } catch (Exception ex){ throw new ServiceRuntimeException("Component " + this.getComponent().getName() + @@ -817,7 +829,7 @@ public class RuntimeEndpointImpl extends EndpointImpl implements RuntimeEndpoint if (contractBuilder == null){ throw new ServiceRuntimeException("Contract builder not found while calculating WSDL contract for " + this.toString()); } - contractBuilder.build(getComponentServiceInterfaceContract(), null); + contractBuilder.build(interfaceContract, null); } } diff --git a/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeEndpointReferenceImpl.java b/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeEndpointReferenceImpl.java index 3873185e6b..5f5bbb19ce 100644 --- a/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeEndpointReferenceImpl.java +++ b/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeEndpointReferenceImpl.java @@ -325,15 +325,25 @@ public class RuntimeEndpointReferenceImpl extends EndpointReferenceImpl implemen if ((referenceContract != null) && (bindingContract != null)){ - + boolean bindingHasCallback = bindingContract.getCallbackInterface() != null; try { - - if ((referenceContract.getClass() != bindingContract.getClass()) && - (referenceContract instanceof JavaInterfaceContract)) { +/* + interfaceContractMapper.checkCompatibility(getGeneratedWSDLContract(referenceContract), + getGeneratedWSDLContract(bindingContract), + Compatibility.SUBSET, + !bindingHasCallback, // ignore callbacks if binding doesn't have one + false); +*/ + // Use the normalized contract if the interface types are different or if + // a normalized contract has been previously generate, for example, by virtue + // of finding a JAXWS annotation on a Java class that references a WSDL file + if (referenceContract.getClass() != bindingContract.getClass() || + referenceContract.getNormalizedWSDLContract() != null || + bindingContract.getNormalizedWSDLContract() != null) { interfaceContractMapper.checkCompatibility(getGeneratedWSDLContract(referenceContract), - bindingContract, + getGeneratedWSDLContract(bindingContract), Compatibility.SUBSET, !bindingHasCallback, // ignore callbacks if binding doesn't have one false); @@ -344,7 +354,6 @@ public class RuntimeEndpointReferenceImpl extends EndpointReferenceImpl implemen !bindingHasCallback, // ignore callbacks if binding doesn't have one false); } - } catch (Exception ex){ throw new ServiceRuntimeException("Component " + this.getComponent().getName() + @@ -608,7 +617,7 @@ public class RuntimeEndpointReferenceImpl extends EndpointReferenceImpl implemen if (contractBuilder == null){ throw new ServiceRuntimeException("Contract builder not found while calculating WSDL contract for " + this.toString()); } - contractBuilder.build(getComponentReferenceInterfaceContract(), null); + contractBuilder.build(interfaceContract, null); } } diff --git a/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/impl/EndpointReferenceBinderImpl.java b/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/impl/EndpointReferenceBinderImpl.java index dfeebe2ec6..96d44b3bc2 100644 --- a/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/impl/EndpointReferenceBinderImpl.java +++ b/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/impl/EndpointReferenceBinderImpl.java @@ -44,7 +44,10 @@ import org.apache.tuscany.sca.core.FactoryExtensionPoint; import org.apache.tuscany.sca.core.UtilityExtensionPoint; import org.apache.tuscany.sca.core.assembly.impl.RuntimeEndpointReferenceImpl; import org.apache.tuscany.sca.definitions.Definitions; +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.util.Audit; import org.apache.tuscany.sca.monitor.Monitor; import org.apache.tuscany.sca.monitor.MonitorFactory; @@ -776,7 +779,10 @@ public class EndpointReferenceBinderImpl implements EndpointReferenceBinder { private boolean haveMatchingInterfaceContracts(EndpointReference endpointReference, Endpoint endpoint, Audit matchAudit){ matchAudit.append("Match interface of " + endpointReference.toString() + " to " + endpoint.toString() + " "); - if (endpointReference.getReference().getInterfaceContract() == null){ + InterfaceContract endpointReferenceContract = endpointReference.getReference().getInterfaceContract(); + InterfaceContract endpointContract = endpoint.getComponentServiceInterfaceContract(); + + if (endpointReferenceContract == null){ matchAudit.append("Match because there is no interface contract on the reference "); matchAudit.appendSeperator(); return true; @@ -784,7 +790,8 @@ public class EndpointReferenceBinderImpl implements EndpointReferenceBinder { // TODO - is there a better test for this. Would have to cast to the // correct iface type to get to the resolved flag - if (endpoint.getComponentServiceInterfaceContract().getInterface().getOperations().size() == 0){ + // We need to rely on normailzed interfaces in this case!! + if (endpointContract.getInterface().getOperations().size() == 0){ // the interface contract is likely remote but unresolved // we discussed this on the ML and decided that we could // live with this for the case where there is no central matching of references @@ -793,13 +800,23 @@ public class EndpointReferenceBinderImpl implements EndpointReferenceBinder { matchAudit.appendSeperator(); return true; } + + // If the contracts are not of the same type or normalized interfaces are available + // use them + if (endpointReferenceContract.getClass() != endpointContract.getClass() || + endpointReferenceContract.getNormalizedWSDLContract() != null || + endpointContract.getNormalizedWSDLContract() != null) { + endpointReferenceContract = ((RuntimeEndpointReference)endpointReference).getGeneratedWSDLContract(endpointReferenceContract); + endpointContract = ((RuntimeEndpoint)endpoint).getGeneratedWSDLContract(endpointContract); + } boolean match = false; - match = interfaceContractMapper.isCompatibleSubset(endpointReference.getReference().getInterfaceContract(), - endpoint.getComponentServiceInterfaceContract(), matchAudit); + match = interfaceContractMapper.isCompatibleSubset(endpointReferenceContract, + endpointContract, + matchAudit); if (!match){ - matchAudit.append("Match failed because the linterface contract mapper failed "); + matchAudit.append("Match failed because the interface contract mapper failed "); } else { matchAudit.append("Match because the interface contract mapper succeeded "); } -- cgit v1.2.3