private void merge( Map<Service, DependencyGraph> serviceGraphMapping, DependencyInicilizer inicializer, Service service, ServiceSpecification dependencySpecification, Service dependencyService, DependencyGraph targetGraph, DependencyGraph serviceGraph, final DependencyGraphNode dependency) { if (targetGraph.isEmpty()) { serviceGraph.addDependency( dependency, new DependencyGraphNode(service, inicializer), !dependencySpecification.isOptional()); serviceGraphMapping.put(dependencyService, serviceGraph); } else { DependencyGraph mergedGraph = serviceGraph.merge(targetGraph); List<Service> keyServices = new LinkedList<Service>(); for (Map.Entry<Service, DependencyGraph> entry : serviceGraphMapping.entrySet()) { if (entry.getValue().equals(targetGraph) || entry.getValue().equals(serviceGraph)) { keyServices.add(entry.getKey()); } } serviceGraphMapping.values().remove(serviceGraph); serviceGraphMapping.values().remove(targetGraph); for (Service sk : keyServices) { serviceGraphMapping.put(sk, mergedGraph); } } }
/** * activate all collected services * * @param services the services to activate * @param serviceContext the context to activate them with. */ protected void activate(Collection<Service> allServices, final ServiceContext serviceContext) { List<Service> services = new LinkedList<Service>(allServices); // add the services already provided by the bootstrap with null // activator. ServiceActivator doNothingActivator = new DoNothingServiceActivator(); services.add( ServiceBuilder.forContract(BootstrapService.class) .activatedBy(doNothingActivator) .newInstance()); services.add( ServiceBuilder.forContract(LoggingService.class) .activatedBy(doNothingActivator) .newInstance()); services.add( ServiceBuilder.forContract(FileContextService.class) .activatedBy(doNothingActivator) .newInstance()); services.add( ServiceBuilder.forContract(LocalizationService.class) .activatedBy(doNothingActivator) .newInstance()); services.add( ServiceBuilder.forContract(WiringService.class) .activatedBy(doNothingActivator) .newInstance()); Map<ServiceSpecification, Service> servicesMap = new HashMap<ServiceSpecification, Service>(); Map<Service, DependencyGraph> serviceGraphMapping = new HashMap<Service, DependencyGraph>(); // add all services specifications targets to map and inicialize the seed graphs for (Service s : services) { servicesMap.put(s.getServiceSpecification(), s); if (s.getDependencies().isEmpty()) { // is seed serviceGraphMapping.put(s, new DependencyGraph()); } } // treat possible all optional not present // // for (Service s : services) { // // final Collection<ServiceSpecification> optionalDependencies = s.getOptionalDependencies(); // if (optionalDependencies.size() == s.getDependencies().size()){ // serviceGraphMapping.put(s, new DependencyGraph()); // } // } // DependencyInicilizer ini = new ServiceDependencyInicilizer(serviceContext); // Create DependencyGraph for (Service s : services) { for (ServiceSpecification dependencySpecification : s.getDependencies()) { Service dependencyService = servicesMap.get(dependencySpecification); DependencyGraph targetGraph = serviceGraphMapping.get(dependencyService); DependencyGraph serviceGraph = serviceGraphMapping.get(s); final DependencyGraphNode dependency = new DependencyGraphNode(dependencyService, ini); if (targetGraph == null) { for (DependencyGraph g : serviceGraphMapping.values()) { for (Graph.Vertex<DependencyGraphNode, DependencyGraphEdge> vertex : g.getVertices()) { if (vertex.getObject().equals(dependency)) { // this is the graph if (serviceGraph != null && !serviceGraph.equals(g)) { // need merge merge( serviceGraphMapping, ini, s, dependencySpecification, dependencyService, targetGraph, serviceGraph, dependency); } else { g.addDependency( dependency, new DependencyGraphNode(s, ini), !dependencySpecification.isOptional()); serviceGraphMapping.put(s, g); } } } } } else { if (serviceGraph != null && !serviceGraph.equals(targetGraph)) { // need merge merge( serviceGraphMapping, ini, s, dependencySpecification, dependencyService, targetGraph, serviceGraph, dependency); } else { targetGraph.addDependency( dependency, new DependencyGraphNode(s, ini), !dependencySpecification.isOptional()); serviceGraphMapping.put(s, targetGraph); } } } } for (Map.Entry<Service, DependencyGraph> entry : serviceGraphMapping.entrySet()) { DependencyGraph graph = entry.getValue(); if (graph.isEmpty()) { // there is no vertice in the graph so initilize the mapped service directly ini.inicialize(new DependencyGraphNode(entry.getKey(), ini)); } else { graph.resolve(); } } for (Iterator<Service> it = services.iterator(); it.hasNext(); ) { final Service service = it.next(); if (!service.isActivated()) { throw new IllegalStateException("Service " + service.getName() + " was not initialized."); } } }