X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=system%2Fgeneral%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fsystem%2FContainer.java;h=d9dc29be471126bdfeba4f818c4b2e859e5d6ff4;hb=0c19405988efb348c1bc1636b8bde49a6776a743;hp=a23a7373aba0b9635ec9ad4e7c9b5d802d753281;hpb=0af4854898104bd6322c0f22feb6dc285859f420;p=utils diff --git a/system/general/src/main/java/org/wamblee/system/Container.java b/system/general/src/main/java/org/wamblee/system/Container.java index a23a7373..d9dc29be 100644 --- a/system/general/src/main/java/org/wamblee/system/Container.java +++ b/system/general/src/main/java/org/wamblee/system/Container.java @@ -28,11 +28,11 @@ public class Container extends AbstractComponent { * @param aProvided Provided services of the system. * @param aRequired Required services by the system. */ - public Container(String aName, ServiceRegistry aRegistry, Component[] aSystems, + public Container(String aName, Component[] aSystems, ProvidedInterface[] aProvided, RequiredInterface[] aRequired) { - super(aName, aRegistry, aProvided, aRequired); + super(aName, aProvided, aRequired); _systems = aSystems; - validate(); + validate(aRequired); } /** @@ -41,7 +41,7 @@ public class Container extends AbstractComponent { * no services in the provided list that cannot be provided. * Also logs a warning in case of superfluous requirements. */ - private void validate() { + private void validate(RequiredInterface[] aRequired) { List provided = new ArrayList(); for (Component system : _systems) { provided.addAll(Arrays.asList(system.getProvidedServices())); @@ -69,12 +69,17 @@ public class Container extends AbstractComponent { List reallyRequired = new ArrayList( required); + // Compute all required interfaces that are not provided for (ProvidedInterface service : provided) { - reallyRequired.remove(service); - } - for (RequiredInterface service: getRequiredServices()) { - reallyRequired.remove(service); + List fulfilled = + Arrays.asList(SystemAssembler.filterRequiredServices(service, + reallyRequired)); + reallyRequired.removeAll(fulfilled); } + // Now the remaining interfaces should be covered by the required + // list. + reallyRequired.removeAll(Arrays.asList(aRequired)); + String missingRequired = ""; for (RequiredInterface service: reallyRequired) { missingRequired += service + "\n"; @@ -85,14 +90,23 @@ public class Container extends AbstractComponent { } @Override - protected void doStart(String aContext, Service[] aRequiredServices) { - List descriptors = new ArrayList(); - for (Service service : aRequiredServices) { - descriptors.add(service.getDescriptor()); + protected void doStart(String aContext) { + List provided = new ArrayList(); + + // all interfaces from the required list of this container are + // provided to the components inside it. + RequiredInterface[] required = getRequiredServices(); + for (RequiredInterface intf: required) { + ProvidedInterface provider = intf.getProvider(); + if ( provider == null ) { + throw new SystemAssemblyException(aContext + ": required interface '" + intf +"' is not provided"); + } + provided.add(intf.getProvider()); } - SystemAssembler assembler = new SystemAssembler(aContext + "." + getName(), _systems, - descriptors.toArray(new ProvidedInterface[0])); - assembler.start(getRegistry(), aRequiredServices); + + SystemAssembler assembler = new SystemAssembler( _systems, + provided.toArray(new ProvidedInterface[0])); + assembler.start(); } @Override