Merge "Reduce verbosity/criticality of inconsistent yangstore messages"
[controller.git] / opendaylight / config / config-manager / src / main / java / org / opendaylight / controller / config / manager / impl / dependencyresolver / DependencyResolverManager.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.controller.config.manager.impl.dependencyresolver;
9
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;
21
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;
28 import java.util.Map;
29
30 /**
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.
34  */
35 public class DependencyResolverManager implements TransactionHolder, DependencyResolverFactory {
36     @GuardedBy("this")
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;
42
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;
49     }
50
51     @Override
52     public DependencyResolver createDependencyResolver(ModuleIdentifier moduleIdentifier) {
53         return getOrCreate(moduleIdentifier);
54     }
55
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);
62         }
63         return dependencyResolver;
64     }
65
66     /**
67      * Get all dependency resolvers, including those that belong to destroyed
68      * things?
69      */
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);
76         }
77         Collections.sort(sorted);
78         return sorted;
79     }
80
81     public List<ModuleIdentifier> getSortedModuleIdentifiers() {
82         List<ModuleIdentifier> result = new ArrayList<>(
83                 moduleIdentifiersToDependencyResolverMap.size());
84         for (DependencyResolverImpl dri : getAllSorted()) {
85             ModuleIdentifier driName = dri.getIdentifier();
86             result.add(driName);
87         }
88         return result;
89     }
90
91     @Override
92     public ModuleInternalTransactionalInfo destroyModule(
93             ModuleIdentifier moduleIdentifier) {
94         transactionStatus.checkNotCommitted();
95         ModuleInternalTransactionalInfo found = modulesHolder
96                 .destroyModule(moduleIdentifier);
97         moduleIdentifiersToDependencyResolverMap.remove(moduleIdentifier);
98         return found;
99     }
100
101     // protect write access
102     @Override
103     public void put(
104             ModuleInternalTransactionalInfo moduleInternalTransactionalInfo) {
105         transactionStatus.checkNotCommitted();
106         modulesHolder.put(moduleInternalTransactionalInfo);
107     }
108
109     // wrapped methods:
110
111     @Override
112     public CommitInfo toCommitInfo() {
113         return modulesHolder.toCommitInfo();
114     }
115
116     @Override
117     public Module findModule(ModuleIdentifier moduleIdentifier,
118             JmxAttribute jmxAttributeForReporting) {
119         return modulesHolder.findModule(moduleIdentifier,
120                 jmxAttributeForReporting);
121     }
122
123     @Override
124     public ModuleInternalTransactionalInfo findModuleInternalTransactionalInfo(ModuleIdentifier moduleIdentifier) {
125         return modulesHolder.findModuleInternalTransactionalInfo(moduleIdentifier);
126     }
127
128     @Override
129     public ModuleFactory findModuleFactory(ModuleIdentifier moduleIdentifier,
130             JmxAttribute jmxAttributeForReporting) {
131         return modulesHolder.findModuleFactory(moduleIdentifier,
132                 jmxAttributeForReporting);
133     }
134
135     @Override
136     public Map<ModuleIdentifier, Module> getAllModules() {
137         return modulesHolder.getAllModules();
138     }
139
140     @Override
141     public void assertNotExists(ModuleIdentifier moduleIdentifier)
142             throws InstanceAlreadyExistsException {
143         modulesHolder.assertNotExists(moduleIdentifier);
144     }
145
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());
151             }
152         }
153         return result;
154     }
155 }