Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- private void resolve(final ServiceDefinition serviceDefinition, final Map<ServiceName, ServiceDefinition> serviceDefinitions, final Set<ServiceName> processed, final Set<ServiceName> visited) throws ServiceRegistryException {
- if (!visited.add(serviceDefinition.getName()))
- throw new CircularDependencyException("Circular dependency discovered: " + visited);
- try {
- if(processed.add(serviceDefinition.getName())) {
- final ServiceBuilder<Service> builder = serviceContainer.buildService(serviceDefinition.getService());
- for (String dependency : serviceDefinition.getDependencies()) {
- final ServiceName dependencyName = ServiceName.create(dependency);
- ServiceController<Service> dependencyController = registry.get(dependencyName);
- if(dependencyController != null) {
- builder.addDependency(dependencyController);
- continue;
- }
- final ServiceDefinition dependencyDefinition = serviceDefinitions.get(dependencyName);
- if (dependencyDefinition == null)
- throw new MissingDependencyException("Missing dependency: " + serviceDefinition.getName() + " depends on " + dependencyName + " which can not be found");
- resolve(dependencyDefinition, serviceDefinitions, processed, visited);
- dependencyController = registry.get(dependencyName);
- if(dependencyController == null)
- throw new ResolutionException("WTF....");
- builder.addDependency(dependencyController);
- }
- // We are resolved. Lets install
- builder.addListener(new ServiceUnregisterListner(serviceDefinition.getName()));
- if (registry.putIfAbsent(serviceDefinition.getName(), builder.create()) != null) {
- throw new ServiceRegistryException("Duplicate service name provided: " + serviceDefinition.getName());
- }
- }
- } finally {
- visited.remove(serviceDefinition.getName());
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement