summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoredwardsmj <edwardsmj@13f79535-47bb-0310-9956-ffa450edef68>2008-11-06 17:00:16 +0000
committeredwardsmj <edwardsmj@13f79535-47bb-0310-9956-ffa450edef68>2008-11-06 17:00:16 +0000
commitebd2a0edbe3564d1a81ccc7535337a22ff3acb14 (patch)
tree503cd87dea4c29ec88f3e91c3cef14a932afb841
parent71685ad6511eaaccaa444f62bad1882b5b2d07d2 (diff)
Changes to enable consumers and producers to be connected via binding.sca
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@711909 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--sandbox/event/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/RuntimeWireImpl.java76
-rw-r--r--sandbox/event/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/ConsumerInvokerHelper.java97
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