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 org.opendaylight.controller.config.api.DependencyResolver;
11 import org.opendaylight.controller.config.api.DependencyResolverFactory;
12 import org.opendaylight.controller.config.api.JmxAttribute;
13 import org.opendaylight.controller.config.api.ModuleIdentifier;
14 import org.opendaylight.controller.config.api.ServiceReferenceReadableRegistry;
15 import org.opendaylight.controller.config.manager.impl.CommitInfo;
16 import org.opendaylight.controller.config.manager.impl.ModuleInternalTransactionalInfo;
17 import org.opendaylight.controller.config.manager.impl.TransactionStatus;
18 import org.opendaylight.controller.config.spi.Module;
19 import org.opendaylight.controller.config.spi.ModuleFactory;
20 import org.opendaylight.yangtools.yang.data.impl.codec.CodecRegistry;
22 import javax.annotation.concurrent.GuardedBy;
23 import javax.management.InstanceAlreadyExistsException;
24 import java.util.ArrayList;
25 import java.util.Collections;
26 import java.util.HashMap;
27 import java.util.List;
31 * Holds information about modules being created and destroyed within this
32 * transaction. Observes usage of DependencyResolver within modules to figure
33 * out dependency tree.
35 public class DependencyResolverManager implements TransactionHolder, DependencyResolverFactory {
37 private final Map<ModuleIdentifier, DependencyResolverImpl> moduleIdentifiersToDependencyResolverMap = new HashMap<>();
38 private final ModulesHolder modulesHolder;
39 private final TransactionStatus transactionStatus;
40 private final ServiceReferenceReadableRegistry readableRegistry;
41 private final CodecRegistry codecRegistry;
43 public DependencyResolverManager(String transactionName,
44 TransactionStatus transactionStatus, ServiceReferenceReadableRegistry readableRegistry, CodecRegistry codecRegistry) {
45 this.modulesHolder = new ModulesHolder(transactionName);
46 this.transactionStatus = transactionStatus;
47 this.readableRegistry = readableRegistry;
48 this.codecRegistry = codecRegistry;
52 public DependencyResolver createDependencyResolver(ModuleIdentifier moduleIdentifier) {
53 return getOrCreate(moduleIdentifier);
56 public synchronized DependencyResolverImpl getOrCreate(ModuleIdentifier name) {
57 DependencyResolverImpl dependencyResolver = moduleIdentifiersToDependencyResolverMap.get(name);
58 if (dependencyResolver == null) {
59 transactionStatus.checkNotCommitted();
60 dependencyResolver = new DependencyResolverImpl(name, transactionStatus, modulesHolder, readableRegistry, codecRegistry);
61 moduleIdentifiersToDependencyResolverMap.put(name, dependencyResolver);
63 return dependencyResolver;
67 * Get all dependency resolvers, including those that belong to destroyed
70 private List<DependencyResolverImpl> getAllSorted() {
71 transactionStatus.checkCommitted();
72 List<DependencyResolverImpl> sorted = new ArrayList<>(
73 moduleIdentifiersToDependencyResolverMap.values());
74 for (DependencyResolverImpl dri : sorted) {
75 dri.countMaxDependencyDepth(this);
77 Collections.sort(sorted);
81 public List<ModuleIdentifier> getSortedModuleIdentifiers() {
82 List<ModuleIdentifier> result = new ArrayList<>(
83 moduleIdentifiersToDependencyResolverMap.size());
84 for (DependencyResolverImpl dri : getAllSorted()) {
85 ModuleIdentifier driName = dri.getIdentifier();
92 public ModuleInternalTransactionalInfo destroyModule(
93 ModuleIdentifier moduleIdentifier) {
94 transactionStatus.checkNotCommitted();
95 ModuleInternalTransactionalInfo found = modulesHolder
96 .destroyModule(moduleIdentifier);
97 moduleIdentifiersToDependencyResolverMap.remove(moduleIdentifier);
101 // protect write access
104 ModuleInternalTransactionalInfo moduleInternalTransactionalInfo) {
105 transactionStatus.checkNotCommitted();
106 modulesHolder.put(moduleInternalTransactionalInfo);
112 public CommitInfo toCommitInfo() {
113 return modulesHolder.toCommitInfo();
117 public Module findModule(ModuleIdentifier moduleIdentifier,
118 JmxAttribute jmxAttributeForReporting) {
119 return modulesHolder.findModule(moduleIdentifier,
120 jmxAttributeForReporting);
124 public ModuleInternalTransactionalInfo findModuleInternalTransactionalInfo(ModuleIdentifier moduleIdentifier) {
125 return modulesHolder.findModuleInternalTransactionalInfo(moduleIdentifier);
129 public ModuleFactory findModuleFactory(ModuleIdentifier moduleIdentifier,
130 JmxAttribute jmxAttributeForReporting) {
131 return modulesHolder.findModuleFactory(moduleIdentifier,
132 jmxAttributeForReporting);
136 public Map<ModuleIdentifier, Module> getAllModules() {
137 return modulesHolder.getAllModules();
141 public void assertNotExists(ModuleIdentifier moduleIdentifier)
142 throws InstanceAlreadyExistsException {
143 modulesHolder.assertNotExists(moduleIdentifier);
146 public List<ModuleIdentifier> findAllByFactory(ModuleFactory factory) {
147 List<ModuleIdentifier> result = new ArrayList<>();
148 for( ModuleInternalTransactionalInfo info : modulesHolder.getAllInfos()) {
149 if (factory.equals(info.getModuleFactory())) {
150 result.add(info.getIdentifier());