2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.controller.config.manager.impl.dependencyresolver;
10 import java.util.ArrayList;
11 import java.util.Collections;
12 import java.util.HashMap;
13 import java.util.List;
16 import javax.annotation.concurrent.GuardedBy;
17 import javax.management.InstanceAlreadyExistsException;
19 import org.opendaylight.controller.config.api.DependencyResolver;
20 import org.opendaylight.controller.config.api.DependencyResolverFactory;
21 import org.opendaylight.controller.config.api.JmxAttribute;
22 import org.opendaylight.controller.config.api.ModuleIdentifier;
23 import org.opendaylight.controller.config.manager.impl.CommitInfo;
24 import org.opendaylight.controller.config.manager.impl.ModuleInternalTransactionalInfo;
25 import org.opendaylight.controller.config.manager.impl.TransactionStatus;
26 import org.opendaylight.controller.config.spi.Module;
27 import org.opendaylight.controller.config.spi.ModuleFactory;
30 * Holds information about modules being created and destroyed within this
31 * transaction. Observes usage of DependencyResolver within modules to figure
32 * out dependency tree.
34 public class DependencyResolverManager implements TransactionHolder, DependencyResolverFactory {
36 private final Map<ModuleIdentifier, DependencyResolverImpl> moduleIdentifiersToDependencyResolverMap = new HashMap<>();
37 private final ModulesHolder modulesHolder;
38 private final TransactionStatus transactionStatus;
40 public DependencyResolverManager(String transactionName,
41 TransactionStatus transactionStatus) {
42 this.modulesHolder = new ModulesHolder(transactionName);
43 this.transactionStatus = transactionStatus;
47 public DependencyResolver createDependencyResolver(ModuleIdentifier moduleIdentifier) {
48 return getOrCreate(moduleIdentifier);
51 public synchronized DependencyResolverImpl getOrCreate(ModuleIdentifier name) {
52 DependencyResolverImpl dependencyResolver = moduleIdentifiersToDependencyResolverMap
54 if (dependencyResolver == null) {
55 transactionStatus.checkNotCommitted();
56 dependencyResolver = new DependencyResolverImpl(name,
57 transactionStatus, modulesHolder);
58 moduleIdentifiersToDependencyResolverMap.put(name,
61 return dependencyResolver;
65 * Get all dependency resolvers, including those that belong to destroyed
68 private List<DependencyResolverImpl> getAllSorted() {
69 transactionStatus.checkCommitted();
70 List<DependencyResolverImpl> sorted = new ArrayList<>(
71 moduleIdentifiersToDependencyResolverMap.values());
72 for (DependencyResolverImpl dri : sorted) {
73 dri.countMaxDependencyDepth(this);
75 Collections.sort(sorted);
79 public List<ModuleIdentifier> getSortedModuleIdentifiers() {
80 List<ModuleIdentifier> result = new ArrayList<>(
81 moduleIdentifiersToDependencyResolverMap.size());
82 for (DependencyResolverImpl dri : getAllSorted()) {
83 ModuleIdentifier driName = dri.getName();
90 public ModuleInternalTransactionalInfo destroyModule(
91 ModuleIdentifier moduleIdentifier) {
92 transactionStatus.checkNotCommitted();
93 ModuleInternalTransactionalInfo found = modulesHolder
94 .destroyModule(moduleIdentifier);
95 moduleIdentifiersToDependencyResolverMap.remove(moduleIdentifier);
99 // protect write access
102 ModuleInternalTransactionalInfo moduleInternalTransactionalInfo) {
103 transactionStatus.checkNotCommitted();
104 modulesHolder.put(moduleInternalTransactionalInfo);
110 public CommitInfo toCommitInfo() {
111 return modulesHolder.toCommitInfo();
115 public Module findModule(ModuleIdentifier moduleIdentifier,
116 JmxAttribute jmxAttributeForReporting) {
117 return modulesHolder.findModule(moduleIdentifier,
118 jmxAttributeForReporting);
122 public ModuleFactory findModuleFactory(ModuleIdentifier moduleIdentifier,
123 JmxAttribute jmxAttributeForReporting) {
124 return modulesHolder.findModuleFactory(moduleIdentifier,
125 jmxAttributeForReporting);
129 public Map<ModuleIdentifier, Module> getAllModules() {
130 return modulesHolder.getAllModules();
134 public void assertNotExists(ModuleIdentifier moduleIdentifier)
135 throws InstanceAlreadyExistsException {
136 modulesHolder.assertNotExists(moduleIdentifier);
139 public List<ModuleIdentifier> findAllByFactory(ModuleFactory factory) {
140 List<ModuleIdentifier> result = new ArrayList<>();
141 for( ModuleInternalTransactionalInfo info : modulesHolder.getAllInfos()) {
142 if (factory.equals(info.getModuleFactory())) {
143 result.add(info.getName());