import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.wamblee.general.Pair;
/**
* Container consisting of multiple components.
private List<Component> _components;
private Set<String> _componentNames;
+ private CompositeInterfaceRestriction _restriction;
private boolean _sealed;
- public static RequiredInterface[] filterRequiredServices(
- ProvidedInterface aProvided,
- Collection<RequiredInterface> aDescriptors) {
- List<RequiredInterface> required = new ArrayList<RequiredInterface>();
- for (RequiredInterface descriptor : aDescriptors) {
- if (descriptor.implementedBy(aProvided)) {
- required.add(descriptor);
- }
- }
- return required.toArray(new RequiredInterface[0]);
- }
public static ProvidedInterface[] filterProvidedServices(
- RequiredInterface aRequired, Collection<ProvidedInterface> aProvided) {
- List<ProvidedInterface> provided = new ArrayList<ProvidedInterface>();
- for (ProvidedInterface descriptor : aProvided) {
- if (aRequired.implementedBy(descriptor)) {
- provided.add(descriptor);
+ Component aClient, RequiredInterface aRequired, Collection<Pair<ProvidedInterface,Component>> aProvided,
+ InterfaceRestriction aRestriction) {
+ List<ProvidedInterface> result = new ArrayList<ProvidedInterface>();
+ for (Pair<ProvidedInterface,Component> descriptor : aProvided) {
+ ProvidedInterface provided = descriptor.getFirst();
+ Component server = descriptor.getSecond();
+ if (aRequired.implementedBy(provided) &&
+ !aRestriction.isViolated(aClient, aRequired, server, provided)) {
+ result.add(provided);
}
}
- return provided.toArray(new ProvidedInterface[0]);
+ return result.toArray(new ProvidedInterface[0]);
}
/**
_components = new ArrayList<Component>();
_componentNames = new HashSet<String>();
+ _restriction = new CompositeInterfaceRestriction();
_sealed = false;
for (Component component : aComponents) {
addComponent(component);
aComponent.addContext(getQualifiedName());
return this;
}
+
+ /**
+ * Adds an interface restriction for explicitly configuring the
+ * relations between components.
+ * @param aRestriction Restriction to add.
+ * @return Reference to this to allow call chaining.
+ */
+ public Container addRestriction(InterfaceRestriction aRestriction) {
+ checkSealed();
+ _restriction.add(aRestriction);
+ return this;
+ }
@Override
public Container addProvidedInterface(ProvidedInterface aProvided) {
Scope scope = new DefaultScope(getProvidedInterfaces(), aExternalScope);
- List<ProvidedInterface> allProvided = new ArrayList<ProvidedInterface>();
-
+ List<Pair<ProvidedInterface,Component>> allProvided = new ArrayList<Pair<ProvidedInterface,Component>>();
+
addProvidersOfRequiredInterfaces(allProvided);
List<Component> started = new ArrayList<Component>();
// add all provided services
ProvidedInterface[] provided = component
.getProvidedInterfaces();
- allProvided.addAll(Arrays.asList(provided));
+ for (ProvidedInterface prov: provided) {
+ allProvided.add(new Pair<ProvidedInterface,Component>(prov, component));
+ }
} catch (SystemAssemblyException e) {
throw e;
} catch (RuntimeException e) {
}
private void addProvidersOfRequiredInterfaces(
- List<ProvidedInterface> allProvided) {
+ List<Pair<ProvidedInterface,Component>> allProvided) {
// all interfaces from the required list of this container are
// provided to the components inside it.
RequiredInterface[] required = getRequiredInterfaces();
for (RequiredInterface intf : required) {
ProvidedInterface provider = intf.getProvider();
if (provider != null) {
- allProvided.add(provider);
+ allProvided.add(new Pair<ProvidedInterface,Component>(provider, null));
} else {
if (!intf.isOptional()) {
throw new SystemAssemblyException(getQualifiedName()
* interfaces.
*/
private void initializeProvidersForRequiredInterfaces(
- List<ProvidedInterface> aAllProvided, Component aComponent,
+ List<Pair<ProvidedInterface,Component>> aAllProvided, Component aComponent,
boolean aValidateOnly) {
// Check if all required services are already provided by
// earlier
// systems.
for (RequiredInterface descriptor : aComponent.getRequiredInterfaces()) {
- ProvidedInterface[] filtered = filterProvidedServices(descriptor,
- aAllProvided);
+ ProvidedInterface[] filtered = filterProvidedServices(aComponent, descriptor,
+ aAllProvided, _restriction);
if (filtered.length == 1) {
if (!aValidateOnly) {
descriptor.setProvider(filtered[0]);