X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=system%2Fgeneral%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fsystem%2FContainer.java;h=d9dc29be471126bdfeba4f818c4b2e859e5d6ff4;hb=6a914dcbd1c89027eafae6021af4199a636e4e48;hp=ee3a053595db2d7a7444d091db19947b0cd4c527;hpb=d75feb16e2143660c69bcf8073fcd8a83cf49f5b;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 ee3a0535..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, - ProvidedInterfaceDescriptor[] aProvided, RequiredInterfaceDescriptor[] aRequired) { - super(aName, aRegistry, aProvided, aRequired); + public Container(String aName, Component[] aSystems, + ProvidedInterface[] aProvided, RequiredInterface[] aRequired) { + super(aName, aProvided, aRequired); _systems = aSystems; - validate(); + validate(aRequired); } /** @@ -41,25 +41,25 @@ 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() { - List provided = new ArrayList(); + private void validate(RequiredInterface[] aRequired) { + List provided = new ArrayList(); for (Component system : _systems) { provided.addAll(Arrays.asList(system.getProvidedServices())); } - List required = new ArrayList(); + List required = new ArrayList(); for (Component system : _systems) { required.addAll(Arrays.asList(system.getRequiredServices())); } - for (ProvidedInterfaceDescriptor service : getProvidedServices()) { + for (ProvidedInterface service : getProvidedServices()) { if (!(provided.contains(service))) { throw new SystemAssemblyException(getName() + ": Service '" + service + "' is not provided by any of the subsystems"); } } - for (RequiredInterfaceDescriptor service : getRequiredServices()) { + for (RequiredInterface service : getRequiredServices()) { if (!(required.contains(service))) { info("Service '" + service @@ -67,16 +67,21 @@ public class Container extends AbstractComponent { } } - List reallyRequired = new ArrayList( + List reallyRequired = new ArrayList( required); - for (ProvidedInterfaceDescriptor service : provided) { - reallyRequired.remove(service); - } - for (RequiredInterfaceDescriptor service: getRequiredServices()) { - reallyRequired.remove(service); + // Compute all required interfaces that are not provided + for (ProvidedInterface service : provided) { + 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 (RequiredInterfaceDescriptor service: reallyRequired) { + for (RequiredInterface service: reallyRequired) { missingRequired += service + "\n"; } if ( missingRequired.length() > 0 ) { @@ -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 ProvidedInterfaceDescriptor[0])); - assembler.start(getRegistry(), aRequiredServices); + + SystemAssembler assembler = new SystemAssembler( _systems, + provided.toArray(new ProvidedInterface[0])); + assembler.start(); } @Override