+ /**
+ * 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));
+ }
+ }
+
+