diff options
2 files changed, 159 insertions, 14 deletions
diff --git a/sandbox/event/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/RuntimeWireImpl.java b/sandbox/event/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/RuntimeWireImpl.java index 2c8cc49d47..8d578bc4f3 100644 --- a/sandbox/event/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/RuntimeWireImpl.java +++ b/sandbox/event/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/RuntimeWireImpl.java @@ -123,7 +123,9 @@ public class RuntimeWireImpl implements RuntimeWire { } if (interfaceContractMapper.isCompatible(operation, op, op.getInterface().isRemotable())) { return chain; - } + } else if( isConsumer(wireTarget) ) { + return chain; + } // end if } return null; } @@ -145,7 +147,7 @@ public class RuntimeWireImpl implements RuntimeWire { chains = new ArrayList<InvocationChain>(); InterfaceContract sourceContract = wireSource.getInterfaceContract(); InterfaceContract targetContract = wireTarget.getInterfaceContract(); - + Contract source = wireSource.getContract(); if (source instanceof RuntimeComponentReference) { // It's the reference wire @@ -154,12 +156,26 @@ public class RuntimeWireImpl implements RuntimeWire { for (Operation operation : sourceContract.getInterface().getOperations()) { Operation targetOperation = interfaceContractMapper.map(targetContract.getInterface(), operation); if (targetOperation == null) { - throw new ServiceRuntimeException("No matching operation for " + operation.getName() - + " is found in reference " - + wireSource.getComponent().getURI() - + "#" - + reference.getName()); - } + // Consumer handling added - Mike Edwards, 06/11/2008 + Contract theContract = wireTarget.getContract(); + boolean error = true; + if( theContract != null ) { + ComponentService theService = (ComponentService)theContract; + if( theService.isConsumer() ) { + error = false; + // Put in the 1st operation in the interface (the actual operation is computed later... + targetOperation = targetContract.getInterface().getOperations().get(0); + } // end if + } // end if + if( error ) { + throw new ServiceRuntimeException("No matching operation for " + operation.getName() + + " is found in reference " + + wireSource.getComponent().getURI() + + "#" + + reference.getName()); + } // end if + // End of consumer handling + } // end if InvocationChain chain = new InvocationChainImpl(operation, targetOperation, true); if (operation.isNonBlocking()) { addNonBlockingInterceptor(reference, refBinding, chain); @@ -175,12 +191,27 @@ public class RuntimeWireImpl implements RuntimeWire { for (Operation operation : sourceContract.getInterface().getOperations()) { Operation targetOperation = interfaceContractMapper.map(targetContract.getInterface(), operation); if (targetOperation == null) { - throw new ServiceRuntimeException("No matching operation for " + operation.getName() - + " is found in service " - + serviceComponent.getURI() - + "#" - + service.getName()); - } + // Consumer handling added - Mike Edwards, 06/11/2008 + Contract theContract = wireTarget.getContract(); + boolean error = true; + if( theContract != null ) { + ComponentService theService = (ComponentService)theContract; + if( theService.isConsumer() ) { + error = false; + // Put in the 1st operation in the interface (the actual operation is computed later... + targetOperation = targetContract.getInterface().getOperations().get(0); + } // end if + } // end if + if( error ) { + throw new ServiceRuntimeException("No matching operation for " + operation.getName() + + " is found in service " + + serviceComponent.getURI() + + "#" + + service.getName()); + } // end if + // End of consumer handling + } // end if + InvocationChain chain = new InvocationChainImpl(operation, targetOperation, false); if (operation.isNonBlocking()) { addNonBlockingInterceptor(service, serviceBinding, chain); @@ -376,4 +407,21 @@ public class RuntimeWireImpl implements RuntimeWire { private void setClonedFrom(RuntimeWireImpl wire) { clonedFrom = wire; } + + /** + * Checks if a target reference is a Consumer + * @param ref - target endpoint reference + * @return true if the endpoint is a Consumer, false otherwise + */ + private static boolean isConsumer( EndpointReference ref ){ + Contract theContract = ref.getContract(); + if( theContract != null ) { + ComponentService theService = (ComponentService)theContract; + if( theService.isConsumer() ) { + return true; + } // end if + } // end if + + return false; + } // end isConsumer } diff --git a/sandbox/event/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/ConsumerInvokerHelper.java b/sandbox/event/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/ConsumerInvokerHelper.java new file mode 100644 index 0000000000..f83a66d44d --- /dev/null +++ b/sandbox/event/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/ConsumerInvokerHelper.java @@ -0,0 +1,97 @@ +/*
+ * 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.core.invocation;
+
+import java.lang.reflect.Method;
+import java.util.List;
+
+import org.apache.tuscany.sca.runtime.RuntimeWire;
+import org.apache.tuscany.sca.runtime.EndpointReference;
+import org.apache.tuscany.sca.interfacedef.InterfaceContract;
+import org.apache.tuscany.sca.interfacedef.Interface;
+import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.assembly.Service;
+import org.apache.tuscany.sca.assembly.Consumer;
+
+/**
+ * Class which provides methods which assist in the invocation of Consumer methods
+ * @author MikeEdwards
+ *
+ */
+public class ConsumerInvokerHelper {
+
+ /**
+ * Returns the name of the Consumer operation for a given event type
+ * @param Args - the parameters for the method to invoke
+ * @param wire - the runtime wire involved in the invocation
+ * @return - the name of the operation - null if no corresponding operation can be found
+ */
+ public static String returnConsumerOperation( Object[] Args, RuntimeWire wire ) {
+ if( isTargetConsumer( wire ) ) {
+ Consumer consumer = getTargetConsumer( wire );
+ String eventType = getEventType( Args[0] );
+ if( consumer != null ) {
+ return consumer.getOperationByEventType(eventType);
+ } // end if
+ } // end if
+ return null;
+ } // end returnConsumerMethod
+
+ /**
+ * Find the event type associated with the argument
+ * @param arg - the argument
+ * @return a String containing the event type
+ */
+ static String getEventType( Object arg ) {
+ Class<?> clazz = arg.getClass();
+ String name = clazz.getCanonicalName();
+
+ // Deal with the case where the argument is some XML holder class (need to look for top level child
+ // object with some "real class"
+
+ // Check if the class is marked with an EventType
+ org.osoa.sca.annotations.EventType eventType = clazz.getAnnotation(org.osoa.sca.annotations.EventType.class);
+ if (eventType != null) {
+ return eventType.name();
+ } else {
+ return name;
+ }// end if
+ } // end getEventType
+
+ /**
+ * For a wire target that is a consumer, returns the Consumer object
+ * @param wire - the wire
+ * @return a Consumer if the wire targets a consumer - otherwise null
+ */
+ static Consumer getTargetConsumer( RuntimeWire wire ) {
+ return ((Service)wire.getTarget().getContract()).getConsumer();
+ }
+
+
+ /**
+ * Determines whether the target of a wire is a Consumer
+ * @param wire - a runtime wire
+ * @return - true if the target of the wire is a Consumer, false otherwise
+ */
+ static boolean isTargetConsumer( RuntimeWire wire ) {
+ Service service = (Service)wire.getTarget().getContract();
+ return service.isConsumer();
+ } // end isTargetConsumer
+
+} // end class ConsumerInvokerHelper
|