super.addRequiredInterface(aRequired);
return this;
}
+
+ @Override
+ public void addContext(String aContext) {
+ super.addContext(aContext);
+ for (Component component: _components) {
+ component.addContext(aContext);
+ }
+ }
/**
* Validates the components together to check that there are no required
}
private void validateProvidedInterfacesArePresent() {
- List<ProvidedInterface> provided = new ArrayList<ProvidedInterface>();
- for (Component component : _components) {
- provided.addAll(Arrays.asList(component.getProvidedInterfaces()));
- }
for (ProvidedInterface service : getProvidedInterfaces()) {
- // TODO provided interfaces by components could be
- // provide subclasses or implementations of the
- // provided interfaces of the container.
- // The code below assumes an exact match.
- if (!(provided.contains(service))) {
- throw new SystemAssemblyException(getQualifiedName() + ": Service '"
- + service
- + "' is not provided by any of its components");
+ findProvidedInterface(service);
+ }
+ }
+
+ /**
+ * Finds the component and provided interface that matches a provided interface of this
+ * container.
+ * @param aProvided Interface to provide externally.
+ * @return Pair of component and provided interface
+ * @throws SystemAssemblyException In case there are multiple matches or no match at all.
+ */
+ private Pair<Component,ProvidedInterface> findProvidedInterface(ProvidedInterface aProvided) {
+ List<Pair<Component,ProvidedInterface>> result =
+ new ArrayList<Pair<Component,ProvidedInterface>>();
+ for (Component component: _components) {
+ for (ProvidedInterface provided: component.getProvidedInterfaces()) {
+ if ( aProvided.equals(provided) ) {
+ result.add(new Pair<Component,ProvidedInterface>(component, provided));
+ }
}
}
+ if ( result.size() == 0) {
+ throw new SystemAssemblyException(getQualifiedName() + ": Service '"
+ + aProvided
+ + "' is not provided by any of its components");
+ }
+ if ( result.size() > 1) {
+ throw new SystemAssemblyException(getQualifiedName() + ": Service '"
+ + aProvided
+ + "' is provided by multiple components: " + result);
+ }
+ return result.get(0);
}
+
/**
* Seal the container, meaning that no further components or interfaces may
* be added.
validate();
Scope scope = new DefaultScope(getProvidedInterfaces(), aExternalScope);
doStartOptionalDryRun(scope, false);
+ exposeProvidedInterfaces(aExternalScope, scope);
seal();
return scope;
}
+ private void exposeProvidedInterfaces(Scope aExternalScope, Scope aInternalScope) {
+ for (ProvidedInterface intf: getProvidedInterfaces()) {
+ Pair<Component, ProvidedInterface> found = findProvidedInterface(intf);
+ Object svc = aInternalScope.getInterfaceImplementation(found.getSecond(), Object.class);
+ addInterface(intf, svc, aExternalScope);
+ }
+ }
+
private void doStartOptionalDryRun(Scope aScope, boolean aDryRun) {
LOG.info("Starting '" + getQualifiedName() + "'");