+ protected void doStart(String aContext) {
+ List<ProvidedInterface> provided = new ArrayList<ProvidedInterface>();
+
+ // 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());
+ }
+
+ startImpl();
+ }
+
+ /**
+ * Starts the subsystems.
+ *
+ * @param aRequiredServices
+ * Services that are available from other systems that have been
+ * started before.
+ */
+ private void startImpl() {
+ LOG.info("Starting '" + "'");
+ List<ProvidedInterface> allProvided = new ArrayList<ProvidedInterface>();
+
+ // Add the provides of all externally required interfaces to the list of available
+ // interfaces
+ for (RequiredInterface required: getRequiredServices()) {
+ allProvided.add(required.getProvider());
+ }
+
+ for (Component system : _systems) {
+ // Check if all required services are already provided by earlier
+ // systems.
+ RequiredInterface[] required = system.getRequiredServices();
+
+ for (RequiredInterface descriptor : required) {
+ ProvidedInterface[] filtered = filterProvidedServices(
+ descriptor, allProvided);
+
+ if (filtered.length == 0) {
+ throw new SystemAssemblyException(
+ "Service '"
+ + descriptor
+ + "' required by system '"
+ + system
+ + "' is not provided by systems that are started earlier");
+ }
+ if (filtered.length > 1) {
+ throw new SystemAssemblyException(
+ "Service '"
+ + descriptor
+ + "' required by system '"
+ + system
+ + "' matches multiple services provided by other systems: " +
+ Arrays.asList(filtered));
+ }
+ descriptor.setProvider(filtered[0]);
+ }
+
+ // Start the service.
+ system.start(getQualifiedName());
+
+ // add all provided services
+ ProvidedInterface[] provided = system.getProvidedServices();
+ allProvided.addAll(Arrays.asList(provided));