TUSCANY-2281 provide a api to allow service references to be retrieved for references where the multiplicity >1. Thanks to Daniel Stucky for the patch.

git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@696666 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
slaws 2008-09-18 14:54:01 +00:00
parent 27e63932d2
commit 76c424d8d4
2 changed files with 73 additions and 0 deletions
java/sca/modules
core/src/main/java/org/apache/tuscany/sca/core/context
sca-api/src/main/java/org/osoa/sca

View file

@ -21,6 +21,8 @@ package org.apache.tuscany.sca.core.context;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.util.Collection;
import java.util.ArrayList;
import org.apache.tuscany.sca.assembly.AssemblyFactory;
import org.apache.tuscany.sca.assembly.Binding;
@ -107,6 +109,14 @@ public class ComponentContextImpl implements RuntimeComponentContext {
try {
for (ComponentReference ref : component.getReferences()) {
if (referenceName.equals(ref.getName())) {
/* ******************** Contribution for issue TUSCANY-2281 ******************** */
Multiplicity multiplicity = ref.getMultiplicity();
if( multiplicity == Multiplicity.ZERO_N || multiplicity == Multiplicity.ONE_N)
{
throw new IllegalArgumentException("Reference " + referenceName + " has multiplicity " + multiplicity);
}
/* ******************** Contribution for issue TUSCANY-2281 ******************** */
return getServiceReference(businessInterface, (RuntimeComponentReference)ref, null);
}
}
@ -400,4 +410,43 @@ public class ComponentContextImpl implements RuntimeComponentContext {
public void write(RuntimeComponentReference reference, Writer writer) throws IOException {
compositeActivator.getComponentContextHelper().write(component, reference, writer);
}
/* ******************** Contribution for issue TUSCANY-2281 ******************** */
/**
* @see ComponentContext#getServices(Class<B>, String)
*/
public <B> Collection<B> getServices(Class<B> businessInterface, String referenceName) {
ArrayList<B> services = new ArrayList<B>();
Collection<ServiceReference<B>> serviceRefs = getServiceReferences(businessInterface, referenceName);
for (ServiceReference<B> serviceRef : serviceRefs) {
services.add(serviceRef.getService());
}
return services;
}
/**
* @see ComponentContext#getServiceReferences(Class<B>, String)
*/
public <B> Collection<ServiceReference<B>> getServiceReferences(Class<B> businessInterface, String referenceName) {
try {
for (ComponentReference ref : component.getReferences()) {
if (referenceName.equals(ref.getName())) {
ArrayList<ServiceReference<B>> serviceRefs = new ArrayList<ServiceReference<B>>();
for(Binding binding : ref.getBindings())
{
serviceRefs.add( getServiceReference(businessInterface, (RuntimeComponentReference) ref, binding) );
}
return serviceRefs;
}
}
throw new ServiceRuntimeException("Reference not found: " + referenceName);
} catch (ServiceRuntimeException e) {
throw e;
} catch (Exception e) {
throw new ServiceRuntimeException(e.getMessage(), e);
}
}
/* ******************** Contribution for issue TUSCANY-2281 ******************** */
}

View file

@ -18,6 +18,8 @@
*/
package org.osoa.sca;
import java.util.Collection;
/**
* Interface providing programmatic access to a component's SCA context as an alternative to injection.
* It provides access to reference and property values for the component and provides a mechanism for
@ -106,4 +108,26 @@ public interface ComponentContext {
* @return the SCA request context; may be null
*/
RequestContext getRequestContext();
/* ******************** Contribution for issue TUSCANY-2281 ******************** */
/**
* Returns a Collection of typed service proxies for a business interface type and a reference name.
* @param businessInterface the interface that will be used to invoke the service
* @param referenceName the name of the reference
* @param <B> the Java type of the business interface for the reference
* @return a Collection of objects that implements the business interface
*/
<B> Collection<B> getServices(Class<B> businessInterface, String referenceName);
/**
* Returns a Collection of typed service reference for a business interface type and a reference name.
* @param businessInterface the interface that will be used to invoke the service
* @param referenceName the name of the reference
* @param <B> the Java type of the business interface for the reference
* @return a Collection of objects that implements the business interface
*/
<B> Collection<ServiceReference<B>> getServiceReferences(Class<B> businessInterface, String referenceName);
}