Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/InvocationChainImpl.java URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/InvocationChainImpl.java?view=diff&rev=441661&r1=441660&r2=441661 ============================================================================== --- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/InvocationChainImpl.java (original) +++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/InvocationChainImpl.java Fri Sep 8 14:37:43 2006 @@ -28,26 +28,34 @@ import org.apache.tuscany.spi.wire.MessageHandler; import org.apache.tuscany.spi.wire.TargetInvoker; - /** * Contains functionality common to source- and target- side invocation chains - * + * * @version $Rev$ $Date$ */ public abstract class InvocationChainImpl implements InvocationChain { protected Operation operation; + protected TargetInvoker targetInvoker; + protected Interceptor interceptorChainHead; + protected Interceptor interceptorChainTail; + protected List<MessageHandler> requestHandlers; + protected List<MessageHandler> responseHandlers; + protected MessageChannel requestChannel; + protected MessageChannel responseChannel; // the pointer to a bridged target request channel, or null if the target has an interceptor protected MessageChannel targetRequestChannel; + // the pointer to a bridged target response channel, or null if the target has an interceptor protected MessageChannel targetResponseChannel; + // the pointer to a bridged target head interceptor or null if the target has no interceptors protected Interceptor targetInterceptorChainHead; @@ -85,6 +93,30 @@ interceptorChainTail = interceptor; } + public void addInterceptor(int index, Interceptor interceptor) { + int i = 0; + Interceptor next = interceptorChainHead; + Interceptor prev = null; + while (next != null && i < index) { + prev = next; + next = next.getNext(); + i++; + } + if (i == index) { + if (prev != null) { + prev.setNext(interceptor); + } else { + interceptorChainHead = interceptor; + } + interceptor.setNext(next); + if (next == null) { + interceptorChainTail = interceptor; + } + } else { + throw new ArrayIndexOutOfBoundsException(index); + } + } + public Interceptor getHeadInterceptor() { return interceptorChainHead; } @@ -140,6 +172,5 @@ public Interceptor getTargetInterceptor() { return targetInterceptorChainHead; } - }
Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKWireService.java URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKWireService.java?view=diff&rev=441661&r1=441660&r2=441661 ============================================================================== --- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKWireService.java (original) +++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/wire/jdk/JDKWireService.java Fri Sep 8 14:37:43 2006 @@ -231,7 +231,7 @@ Class<?> callbackInterface = contract.getCallbackClass(); if (callbackInterface != null) { wire.setCallbackInterface(callbackInterface); - for (Operation<?> operation : contract.getCallbacksOperations().values()) { + for (Operation<?> operation : contract.getCallbackOperations().values()) { InboundInvocationChain callbackTargetChain = createInboundChain(operation); // TODO handle policy //TODO statement below could be cleaner @@ -278,5 +278,58 @@ service.setInboundWire(inboundWire); service.setOutboundWire(outboundWire); } + + public boolean isWireable(ServiceContract<?> source, ServiceContract<?> target) { + if (source == target) { + // Shortcut for performance + return true; + } + if (source.isRemotable() != target.isRemotable()) { + return false; + } + if (source.getInteractionScope() != target.getInteractionScope()) { + return false; + } + + for (Operation<?> operation : source.getOperations().values()) { + Operation<?> targetOperation = target.getOperations().get(operation.getName()); + if (targetOperation == null) { + return false; + } + if (!isCompatibleWith(operation, targetOperation)) { + return false; + } + } + + for (Operation<?> operation : source.getCallbackOperations().values()) { + Operation<?> targetOperation = target.getCallbackOperations().get(operation.getName()); + if (targetOperation == null) { + return false; + } + if (!isCompatibleWith(operation, targetOperation)) { + return false; + } + } + return true; + } + + /** + * The following algorithm is defined the SCA spec: + * <ol> + * <li>compatibility for the individual method is defined as compatibility of the signature, that is method name, + * input types, and output types MUST BE the same. + * <li>the order of the input and output types also MUST BE the same. + * <li>the set of Faults and Exceptions expected by the source MUST BE the same or be a superset of those specified + * by the service. + * </ol> + * + * @param operation + * @return + */ + public boolean isCompatibleWith(Operation<?> source, Operation<?> target) { + // FIXME: + return source.equals(target); + } + } Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/ConnectorPostProcessTestCase.java URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/ConnectorPostProcessTestCase.java?view=diff&rev=441661&r1=441660&r2=441661 ============================================================================== --- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/ConnectorPostProcessTestCase.java (original) +++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/builder/ConnectorPostProcessTestCase.java Fri Sep 8 14:37:43 2006 @@ -18,21 +18,23 @@ */ package org.apache.tuscany.core.builder; +import static org.easymock.EasyMock.createMock; +import static org.easymock.EasyMock.createNiceMock; import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.replay; +import static org.easymock.EasyMock.verify; import java.util.Collections; +import junit.framework.TestCase; + import org.apache.tuscany.spi.builder.WirePostProcessorRegistry; import org.apache.tuscany.spi.component.Component; +import org.apache.tuscany.spi.model.ServiceContract; import org.apache.tuscany.spi.wire.InboundWire; import org.apache.tuscany.spi.wire.OutboundWire; - -import junit.framework.TestCase; +import org.apache.tuscany.spi.wire.WireService; import org.easymock.EasyMock; -import static org.easymock.EasyMock.createMock; -import static org.easymock.EasyMock.createNiceMock; -import static org.easymock.EasyMock.replay; -import static org.easymock.EasyMock.verify; /** * @version $Rev$ $Date$ @@ -49,7 +51,11 @@ WirePostProcessorRegistry registry = createMock(WirePostProcessorRegistry.class); registry.process(EasyMock.eq(iwire), EasyMock.eq(owire)); replay(registry); - ConnectorImpl connector = new ConnectorImpl(registry); + WireService wireService = createMock(WireService.class); + expect(wireService.isWireable((ServiceContract<?>)EasyMock.anyObject(), + (ServiceContract<?>)EasyMock.anyObject())).andReturn(true).anyTimes(); + replay(wireService); + ConnectorImpl connector = new ConnectorImpl(wireService, registry); connector.connect(iwire, owire, false); verify(registry); } @@ -66,10 +72,14 @@ WirePostProcessorRegistry registry = createMock(WirePostProcessorRegistry.class); registry.process(EasyMock.eq(owire), EasyMock.eq(iwire)); replay(registry); + WireService wireService = createMock(WireService.class); + expect(wireService.isWireable((ServiceContract<?>)EasyMock.anyObject(), + (ServiceContract<?>)EasyMock.anyObject())).andReturn(true).anyTimes(); + replay(wireService); + ConnectorImpl connector = new ConnectorImpl(wireService, registry); Component source = createNiceMock(Component.class); expect(source.getName()).andReturn("Component"); replay(source); - ConnectorImpl connector = new ConnectorImpl(registry); connector.connect(source, null, owire, iwire, false); verify(registry); } Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/idl/java/JavaInterfaceProcessorRegistryImplTestCase.java URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/idl/java/JavaInterfaceProcessorRegistryImplTestCase.java?view=diff&rev=441661&r1=441660&r2=441661 ============================================================================== --- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/idl/java/JavaInterfaceProcessorRegistryImplTestCase.java (original) +++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/idl/java/JavaInterfaceProcessorRegistryImplTestCase.java Fri Sep 8 14:37:43 2006 @@ -53,11 +53,11 @@ Operation<Type> baseInt = operations.get("baseInt"); assertNotNull(baseInt); - DataType<Type> returnType = baseInt.getReturnType(); + DataType<Type> returnType = baseInt.getOutputType(); assertEquals(Integer.TYPE, returnType.getPhysical()); assertEquals(Integer.TYPE, returnType.getLogical()); - List<DataType<Type>> parameterTypes = baseInt.getParameterTypes(); + List<DataType<Type>> parameterTypes = baseInt.getInputType().getLogical(); assertEquals(1, parameterTypes.size()); DataType<Type> arg0 = parameterTypes.get(0); assertEquals(Integer.TYPE, arg0.getPhysical()); Modified: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/idl/java/JavaIDLUtils.java URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/idl/java/JavaIDLUtils.java?view=diff&rev=441661&r1=441660&r2=441661 ============================================================================== --- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/idl/java/JavaIDLUtils.java (original) +++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/idl/java/JavaIDLUtils.java Fri Sep 8 14:37:43 2006 @@ -73,14 +73,16 @@ * * @return true if the operation matches, false if does not */ + @SuppressWarnings("unchecked") private static boolean match(Operation<?> operation, Method method) { Class<?>[] params = method.getParameterTypes(); - List<? extends DataType<?>> types = operation.getParameterTypes(); + DataType inputType = operation.getInputType(); + List<DataType<?>> types = (List<DataType<?>>) inputType.getLogical(); boolean found = true; if (types.size() == params.length && method.getName().equals(operation.getName())) { for (int i = 0; i < params.length; i++) { Class<?> clazz = params[i]; - if (!clazz.equals(operation.getParameterTypes().get(i).getPhysical())) { + if (!clazz.equals(operation.getInputType().getLogical().get(i).getPhysical())) { found = false; } } Modified: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/DataType.java URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/DataType.java?view=diff&rev=441661&r1=441660&r2=441661 ============================================================================== --- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/DataType.java (original) +++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/DataType.java Fri Sep 8 14:37:43 2006 @@ -123,6 +123,13 @@ return dataBinding; } + /** + * @param dataBinding the dataBinding to set + */ + public void setDataBinding(String dataBinding) { + this.dataBinding = dataBinding; + } + public int hashCode() { int result; result = dataBinding != null ? dataBinding.hashCode() : 0; @@ -149,7 +156,12 @@ return false; } return !(physical != null ? !physical.equals(dataType.physical) : dataType.physical != null); - } - + + public String toString() { + StringBuffer sb = new StringBuffer(); + sb.append(physical).append(" ").append(dataBinding).append(" ").append(logical); + return sb.toString(); + } + } Modified: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/Operation.java URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/Operation.java?view=diff&rev=441661&r1=441660&r2=441661 ============================================================================== --- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/Operation.java (original) +++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/Operation.java Fri Sep 8 14:37:43 2006 @@ -23,68 +23,90 @@ import java.util.List; import java.util.Map; +import org.apache.tuscany.spi.model.DataType; + /** * Represents an operation that is part of a service contract. The type paramter of this operation identifies the * logical type system for all data types. - * + * * @version $Rev$ $Date$ */ public class Operation<T> { protected Map<String, Object> metaData; + private final String name; - private final DataType<T> returnType; - private final List<DataType<T>> parameterTypes; + + private final DataType<T> outputType; + + private final DataType<List<DataType<T>>> inputType; + private final List<DataType<T>> faultTypes; - private final boolean nonBlocking; - private ServiceContract<?> contract; + + private boolean nonBlocking; + + private ServiceContract<T> contract; + private boolean callback; + private String dataBinding; /** * Construct an operation specifying all characteristics. - * - * @param name the name of the operation - * @param returnType the data type returned by the operation - * @param parameterTypes the data types of parameters passed to the operation - * @param faultTypes the data type of faults raised by the operation - * @param nonBlocking true if the operation is non-blocking - * @param dataBinding the data binding type for the operation - */ - public Operation(String name, - DataType<T> returnType, - List<DataType<T>> parameterTypes, - List<DataType<T>> faultTypes, - boolean nonBlocking, - String dataBinding) { + * + * @param name the name of the operation + * @param outputType the data type returned by the operation + * @param inputType the data types of parameters passed to the operation + * @param faultTypes the data type of faults raised by the operation + * @param nonBlocking true if the operation is non-blocking + * @param dataBinding the data binding type for the operation + */ + public Operation(String name, DataType<List<DataType<T>>> inputType, DataType<T> outputType, + List<DataType<T>> faultTypes) { + this(name, inputType, outputType, faultTypes, true, null); + } + + /** + * @param name + * @param inputType + * @param outputType + * @param faultTypes + * @param nonBlocking + * @param dataBinding + */ + public Operation(final String name, final DataType<List<DataType<T>>> inputType, final DataType<T> outputType, + final List<DataType<T>> faultTypes, boolean nonBlocking, String dataBinding) { + super(); this.name = name; - this.returnType = returnType; - this.parameterTypes = parameterTypes; + List<DataType<T>> types = Collections.emptyList(); + this.inputType = (inputType != null) ? inputType : new DataType<List<DataType<T>>>(Object[].class, types); + this.outputType = (outputType != null) ? outputType : new DataType<T>(void.class, null); this.faultTypes = faultTypes; this.nonBlocking = nonBlocking; this.dataBinding = dataBinding; + } /** * Returns the service contract the operation is part of. - * + * * @return the service contract the operation is part of. */ - public ServiceContract<?> getServiceContract() { + public ServiceContract<T> getServiceContract() { return contract; } /** * Sets the service contract the operation is part of. - * + * * @param contract the service contract the operation is part of. */ - public void setServiceContract(ServiceContract<?> contract) { + public void setServiceContract(ServiceContract<T> contract) { this.contract = contract; } /** * Returns true if the operation is part of the callback contract. - * + * * @return true if the operation is part of the callback contract. */ public boolean isCallback() { @@ -93,7 +115,7 @@ /** * Sets whether the operation is part of the callback contract. - * + * * @param callback whether the operation is part of the callback contract. */ public void setCallback(boolean callback) { @@ -102,7 +124,7 @@ /** * Returns the name of the operation. - * + * * @return the name of the operation */ public String getName() { @@ -111,28 +133,27 @@ /** * Returns the data type returned by the operation. - * + * * @return the data type returned by the operation */ - public DataType<T> getReturnType() { - return returnType; + public DataType<T> getOutputType() { + return outputType; } /** * Returns the data types of the parameters passed to the operation. - * + * + * The inputType's logical type is a list of DataTypes which describes the parameter types + * * @return the data types of the parameters passed to the operation */ - public List<DataType<T>> getParameterTypes() { - if (parameterTypes == null) { - return Collections.emptyList(); - } - return parameterTypes; + public DataType<List<DataType<T>>> getInputType() { + return inputType; } /** * Returns the data types of the faults raised by the operation. - * + * * @return the data types of the faults raised by the operation */ public List<DataType<T>> getFaultTypes() { @@ -145,7 +166,7 @@ /** * Returns true if the operation is non-blocking. A non-blocking operation may not have completed execution at the * time an invocation of the operation returns. - * + * * @return true if the operation is non-blocking */ public boolean isNonBlocking() { @@ -154,26 +175,25 @@ /** * Returns the data binding type specified for the operation or null. - * + * * @return the data binding type specified for the operation or null. */ public String getDataBinding() { return dataBinding; } - + /** * Set the databinding for this operation - * + * * @param dataBinding The databinding */ public void setDataBinding(String dataBinding) { this.dataBinding = dataBinding; } - /** * Returns a map of metadata key to value mappings for the operation. - * + * * @return a map of metadata key to value mappings for the operation. */ public Map<String, Object> getMetaData() { @@ -185,7 +205,7 @@ /** * Adds metadata associated with the operation. - * + * * @param key the metadata key * @param val the metadata value */ @@ -206,26 +226,55 @@ final Operation operation = (Operation) o; + if (name != null ? !name.equals(operation.name) : operation.name != null) { + return false; + } + + // HACK: If the operation is mappable, then the equality test is relaxed + if (isMappable()) { + return true; + } + if (faultTypes != null ? !faultTypes.equals(operation.faultTypes) : operation.faultTypes != null) { return false; } - if (name != null ? !name.equals(operation.name) : operation.name != null) { + + if (inputType != null ? !inputType.equals(operation.inputType) : operation.inputType != null) { return false; } - if (parameterTypes != null ? !parameterTypes.equals(operation.parameterTypes) - : operation.parameterTypes != null) { + return !(outputType != null ? !outputType.equals(operation.outputType) : operation.outputType != null); + } + + private boolean isMappable() { + if (contract != null) { + return contract.isRemotable(); + } else { return false; } - return !(returnType != null ? !returnType.equals(operation.returnType) : operation.returnType != null); } public int hashCode() { int result; result = name != null ? name.hashCode() : 0; - result = 29 * result + (returnType != null ? returnType.hashCode() : 0); - result = 29 * result + (parameterTypes != null ? parameterTypes.hashCode() : 0); + // HACK: + if (isMappable()) { + return result; + } + result = 29 * result + (outputType != null ? outputType.hashCode() : 0); + result = 29 * result + (inputType != null ? inputType.hashCode() : 0); result = 29 * result + (faultTypes != null ? faultTypes.hashCode() : 0); return result; + } + + /** + * @param nonBlocking the nonBlocking to set + */ + public void setNonBlocking(boolean nonBlocking) { + this.nonBlocking = nonBlocking; + } + + public String toString() { + return name; } } Modified: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/ServiceContract.java URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/ServiceContract.java?view=diff&rev=441661&r1=441660&r2=441661 ============================================================================== --- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/ServiceContract.java (original) +++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/ServiceContract.java Fri Sep 8 14:37:43 2006 @@ -22,20 +22,33 @@ import java.util.HashMap; import java.util.Map; +import org.apache.tuscany.spi.model.InteractionScope; +import org.apache.tuscany.spi.model.ModelObject; + /** * Base class representing service contract information - * + * * @version $Rev$ $Date$ */ public abstract class ServiceContract<T> extends ModelObject { protected InteractionScope interactionScope; + + protected boolean remotable; + protected Class<?> interfaceClass; + protected String interfaceName; + protected String callbackName; + protected Class<?> callbackClass; + protected Map<String, Operation<T>> operations; - protected Map<String, Operation<T>> callbacksOperations; + + protected Map<String, Operation<T>> callbackOperations; + protected String dataBinding; + protected Map<String, Object> metaData; protected ServiceContract() { @@ -51,7 +64,7 @@ /** * Returns the interface name for the contract - * + * * @return the interface name for the contract */ public String getInterfaceName() { @@ -132,19 +145,19 @@ this.operations = operations; } - public Map<String, Operation<T>> getCallbacksOperations() { - if (callbacksOperations == null) { + public Map<String, Operation<T>> getCallbackOperations() { + if (callbackOperations == null) { return Collections.emptyMap(); } - return Collections.unmodifiableMap(callbacksOperations); + return Collections.unmodifiableMap(callbackOperations); } - public void setCallbacksOperations(Map<String, Operation<T>> callbacksOperations) { + public void setCallbackOperations(Map<String, Operation<T>> callbacksOperations) { for (Operation<T> operation : callbacksOperations.values()) { operation.setServiceContract(this); operation.setCallback(true); } - this.callbacksOperations = callbacksOperations; + this.callbackOperations = callbacksOperations; } public String getDataBinding() { @@ -157,7 +170,7 @@ /** * Returns a map of metadata key to value mappings for the operation. - * + * * @return a map of metadata key to value mappings for the operation. */ public Map<String, Object> getMetaData() { @@ -169,7 +182,7 @@ /** * Adds metadata associated with the operation. - * + * * @param key the metadata key * @param val the metadata value */ @@ -193,8 +206,8 @@ if (callbackName != null ? !callbackName.equals(that.callbackName) : that.callbackName != null) { return false; } - if (callbacksOperations != null ? !callbacksOperations.equals(that.callbacksOperations) - : that.callbacksOperations != null) { + if (callbackOperations != null ? !callbackOperations.equals(that.callbackOperations) + : that.callbackOperations != null) { return false; } if (interfaceClass != null ? !interfaceClass.equals(that.interfaceClass) : that.interfaceClass != null) { @@ -213,7 +226,21 @@ result = 29 * result + (interfaceName != null ? interfaceName.hashCode() : 0); result = 29 * result + (callbackName != null ? callbackName.hashCode() : 0); result = 29 * result + (operations != null ? operations.hashCode() : 0); - result = 29 * result + (callbacksOperations != null ? callbacksOperations.hashCode() : 0); + result = 29 * result + (callbackOperations != null ? callbackOperations.hashCode() : 0); return result; + } + + /** + * @return the remotable + */ + public boolean isRemotable() { + return remotable; + } + + /** + * @param remotable the remotable to set + */ + public void setRemotable(boolean remotable) { + this.remotable = remotable; } } Modified: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/wire/InvocationChain.java URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/wire/InvocationChain.java?view=diff&rev=441661&r1=441660&r2=441661 ============================================================================== --- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/wire/InvocationChain.java (original) +++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/wire/InvocationChain.java Fri Sep 8 14:37:43 2006 @@ -95,6 +95,7 @@ * Adds an interceptor to the chain */ void addInterceptor(Interceptor interceptor); + void addInterceptor(int index, Interceptor interceptor); /** * Returns the first interceptor in the chain Modified: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/wire/WireService.java URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/wire/WireService.java?view=diff&rev=441661&r1=441660&r2=441661 ============================================================================== --- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/wire/WireService.java (original) +++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/wire/WireService.java Fri Sep 8 14:37:43 2006 @@ -136,5 +136,30 @@ * @param def the model artifact representing the service */ void createWires(Service<?> service, BindlessServiceDefinition def); + + /** + * Check the compatiblity of the source and the target service contracts.<p> + * A wire may only connect a source to a target if the target implements an interface that is compatible with the + * interface required by the source. The source and the target are compatible if: + * <p> + * <ol> + * <li>the source interface and the target interface MUST either both be remotable or they are both local + * <li>the methods on the target interface MUST be the same as or be a superset of the methods in the interface + * specified on the source + * <li>compatibility for the individual method is defined as compatibility of the signature, that is method name, + * input types, and output types MUST BE the same. + * <li>the order of the input and output types also MUST BE the same. + * <li>the set of Faults and Exceptions expected by the source MUST BE the same or be a superset of those specified + * by the service. + * <li>other specified attributes of the two interfaces MUST match, including Scope and Callback interface + * </ol> + * + * <p>Please note this test is not symetric: isWireable(A, B) does NOT imply that isWireable(B, A) + * + * @param source The source service contract + * @param target The target service contract + * @return + */ + boolean isWireable(ServiceContract<?> source, ServiceContract<?> target); } Modified: incubator/tuscany/java/sca/kernel/spi/src/test/java/org/apache/tuscany/spi/idl/java/JavaIDLUtilsTestCase.java URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/test/java/org/apache/tuscany/spi/idl/java/JavaIDLUtilsTestCase.java?view=diff&rev=441661&r1=441660&r2=441661 ============================================================================== --- incubator/tuscany/java/sca/kernel/spi/src/test/java/org/apache/tuscany/spi/idl/java/JavaIDLUtilsTestCase.java (original) +++ incubator/tuscany/java/sca/kernel/spi/src/test/java/org/apache/tuscany/spi/idl/java/JavaIDLUtilsTestCase.java Fri Sep 8 14:37:43 2006 @@ -38,7 +38,9 @@ private List<Operation<?>> operations; public void testNoParamsFindMethod() { - Operation<Type> operation = new Operation<Type>("foo", null, null, null, false, null); + List<DataType<Type>> types = new ArrayList<DataType<Type>>(); + DataType<List<DataType<Type>>> inputType = new DataType<List<DataType<Type>>>(Object[].class, types); + Operation<Type> operation = new Operation<Type>("foo", inputType, null, null, false, null); Method method = findMethod(operation, methods); assertEquals("foo", method.getName()); assertEquals(0, method.getParameterTypes().length); @@ -55,7 +57,8 @@ List<DataType<Type>> types = new ArrayList<DataType<Type>>(); DataType<Type> type = new DataType<Type>(String.class, Object.class); types.add(type); - Operation<Type> operation = new Operation<Type>("foo", null, types, null, false, null); + DataType<List<DataType<Type>>> inputType = new DataType<List<DataType<Type>>>(Object[].class, types); + Operation<Type> operation = new Operation<Type>("foo", inputType, null, null, false, null); Method method = findMethod(operation, methods); assertEquals("foo", method.getName()); assertEquals(String.class, method.getParameterTypes()[0]); @@ -75,7 +78,8 @@ DataType<Type> type2 = new DataType<Type>(String.class, Object.class); types.add(type); types.add(type2); - Operation<Type> operation = new Operation<Type>("foo", null, types, null, false, null); + DataType<List<DataType<Type>>> inputType = new DataType<List<DataType<Type>>>(Object[].class, types); + Operation<Type> operation = new Operation<Type>("foo", inputType, null, null, false, null); Method method = findMethod(operation, methods); assertNull(method); } @@ -84,7 +88,8 @@ List<DataType<Type>> types = new ArrayList<DataType<Type>>(); DataType<Type> type = new DataType<Type>(Integer.class, Object.class); types.add(type); - Operation<Type> operation = new Operation<Type>("foo", null, types, null, false, null); + DataType<List<DataType<Type>>> inputType = new DataType<List<DataType<Type>>>(Object[].class, types); + Operation<Type> operation = new Operation<Type>("foo", inputType, null, null, false, null); Method method = findMethod(operation, methods); assertNull(method); } @@ -93,7 +98,8 @@ List<DataType<Type>> types = new ArrayList<DataType<Type>>(); DataType<Type> type = new DataType<Type>(Integer.class, Object.class); types.add(type); - Operation<Type> operation = new Operation<Type>("foo", null, types, null, false, null); + DataType<List<DataType<Type>>> inputType = new DataType<List<DataType<Type>>>(Object[].class, types); + Operation<Type> operation = new Operation<Type>("foo", inputType, null, null, false, null); Method method = findMethod(operation, methods); assertNull(method); } @@ -102,7 +108,8 @@ List<DataType<Type>> types = new ArrayList<DataType<Type>>(); DataType<Type> type = new DataType<Type>(Integer.TYPE, Object.class); types.add(type); - Operation<Type> operation = new Operation<Type>("foo", null, types, null, false, null); + DataType<List<DataType<Type>>> inputType = new DataType<List<DataType<Type>>>(Object[].class, types); + Operation<Type> operation = new Operation<Type>("foo", inputType, null, null, false, null); Method method = findMethod(operation, methods); assertEquals("foo", method.getName()); assertEquals(Integer.TYPE, method.getParameterTypes()[0]); @@ -111,7 +118,7 @@ public void testPrimitiveParamFindOperation() throws NoSuchMethodException { Method method = Foo.class.getMethod("foo", Integer.TYPE); Operation<?> operation = findOperation(method, operations); - assertEquals(Integer.TYPE, operation.getParameterTypes().get(0).getPhysical()); + assertEquals(Integer.TYPE, operation.getInputType().getLogical().get(0).getPhysical()); } @@ -129,9 +136,10 @@ operations.add(operation); List<DataType<Type>> types = new ArrayList<DataType<Type>>(); + DataType<List<DataType<Type>>> inputType = new DataType<List<DataType<Type>>>(Object[].class, types); DataType<Type> type = new DataType<Type>(String.class, Object.class); types.add(type); - operation = new Operation<Type>("foo", null, types, null, false, null); + operation = new Operation<Type>("foo", inputType, null, null, false, null); operations.add(operation); types = new ArrayList<DataType<Type>>(); @@ -139,19 +147,22 @@ DataType<Type> type2 = new DataType<Type>(String.class, Object.class); types.add(type); types.add(type2); - operation = new Operation<Type>("foo", null, types, null, false, null); + inputType = new DataType<List<DataType<Type>>>(Object[].class, types); + operation = new Operation<Type>("foo", inputType, null, null, false, null); operations.add(operation); types = new ArrayList<DataType<Type>>(); type = new DataType<Type>(Integer.class, Object.class); types.add(type); - operation = new Operation<Type>("foo", null, types, null, false, null); + inputType = new DataType<List<DataType<Type>>>(Object[].class, types); + operation = new Operation<Type>("foo", inputType, null, null, false, null); operations.add(operation); types = new ArrayList<DataType<Type>>(); type = new DataType<Type>(Integer.TYPE, Object.class); types.add(type); - operation = new Operation<Type>("foo", null, types, null, false, null); + inputType = new DataType<List<DataType<Type>>>(Object[].class, types); + operation = new Operation<Type>("foo", inputType, null, null, false, null); operations.add(operation); } Modified: incubator/tuscany/java/sca/kernel/spi/src/test/java/org/apache/tuscany/spi/model/ServiceContractTestCase.java URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/test/java/org/apache/tuscany/spi/model/ServiceContractTestCase.java?view=diff&rev=441661&r1=441660&r2=441661 ============================================================================== --- incubator/tuscany/java/sca/kernel/spi/src/test/java/org/apache/tuscany/spi/model/ServiceContractTestCase.java (original) +++ incubator/tuscany/java/sca/kernel/spi/src/test/java/org/apache/tuscany/spi/model/ServiceContractTestCase.java Fri Sep 8 14:37:43 2006 @@ -44,7 +44,7 @@ Operation<Type> operation = new Operation<Type>("foo", null, null, null, false, null); Map<String, Operation<Type>> ops = new HashMap<String, Operation<Type>>(); ops.put("foo", operation); - contract.setCallbacksOperations(ops); + contract.setCallbackOperations(ops); assertEquals(contract, operation.getServiceContract()); assertTrue(operation.isCallback()); } Modified: incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/ArtifactFactory.java URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/ArtifactFactory.java?view=diff&rev=441661&r1=441660&r2=441661 ============================================================================== --- incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/ArtifactFactory.java (original) +++ incubator/tuscany/java/sca/test/src/main/java/org/apache/tuscany/test/ArtifactFactory.java Fri Sep 8 14:37:43 2006 @@ -53,7 +53,7 @@ } public static Connector createConnector() { - return new ConnectorImpl(); + return new ConnectorImpl(createWireService(), null); } public static WireService createWireService() { --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
