1132f991d171def6652f42c490b0956d4ea634a9
[controller.git] / opendaylight / config / config-manager / src / main / java / org / opendaylight / controller / config / manager / impl / dependencyresolver / ModulesHolder.java
1 /*
2  * Copyright (c) 2013, 2017 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 java.util.ArrayList;
11 import java.util.Collection;
12 import java.util.Collections;
13 import java.util.HashMap;
14 import java.util.HashSet;
15 import java.util.List;
16 import java.util.Map;
17 import java.util.Set;
18 import javax.annotation.concurrent.GuardedBy;
19 import javax.management.InstanceAlreadyExistsException;
20 import org.opendaylight.controller.config.api.JmxAttribute;
21 import org.opendaylight.controller.config.api.JmxAttributeValidationException;
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.TransactionIdentifier;
25 import org.opendaylight.controller.config.spi.Module;
26 import org.opendaylight.controller.config.spi.ModuleFactory;
27
28 /**
29  * Represents modules to be committed.
30  */
31 class ModulesHolder implements AutoCloseable {
32     private final TransactionIdentifier transactionIdentifier;
33     @GuardedBy("this")
34     private final Map<ModuleIdentifier, ModuleInternalTransactionalInfo> commitMap = new HashMap<>();
35
36     @GuardedBy("this")
37     private final Set<ModuleInternalTransactionalInfo> unorderedDestroyedFromPreviousTransactions = new HashSet<>();
38
39     ModulesHolder(final TransactionIdentifier transactionIdentifier) {
40         this.transactionIdentifier = transactionIdentifier;
41     }
42
43     public CommitInfo toCommitInfo() {
44         List<DestroyedModule> orderedDestroyedFromPreviousTransactions = new ArrayList<>(
45                 unorderedDestroyedFromPreviousTransactions.size());
46         for (ModuleInternalTransactionalInfo toBeDestroyed : unorderedDestroyedFromPreviousTransactions) {
47             orderedDestroyedFromPreviousTransactions.add(toBeDestroyed.toDestroyedModule());
48         }
49         Collections.sort(orderedDestroyedFromPreviousTransactions);
50         return new CommitInfo(orderedDestroyedFromPreviousTransactions, commitMap);
51     }
52
53     private ModuleInternalTransactionalInfo findModuleInternalTransactionalInfo(final ModuleIdentifier moduleIdentifier,
54             final JmxAttribute jmxAttributeForReporting) {
55         ModuleInternalTransactionalInfo moduleInternalTransactionalInfo = commitMap.get(moduleIdentifier);
56         JmxAttributeValidationException.checkNotNull(moduleInternalTransactionalInfo,
57                 "Module " + moduleIdentifier + "" + " not found in transaction " + transactionIdentifier,
58                 jmxAttributeForReporting);
59         return moduleInternalTransactionalInfo;
60     }
61
62     public ModuleInternalTransactionalInfo findModuleInternalTransactionalInfo(
63             final ModuleIdentifier moduleIdentifier) {
64         ModuleInternalTransactionalInfo found = commitMap.get(moduleIdentifier);
65         if (found == null) {
66             throw new IllegalStateException("Not found:" + moduleIdentifier);
67         }
68         return found;
69     }
70
71     public Module findModule(final ModuleIdentifier moduleIdentifier, final JmxAttribute jmxAttributeForReporting) {
72         return findModuleInternalTransactionalInfo(moduleIdentifier, jmxAttributeForReporting).getProxiedModule();
73     }
74
75     public ModuleFactory findModuleFactory(final ModuleIdentifier moduleIdentifier,
76             final JmxAttribute jmxAttributeForReporting) {
77         return findModuleInternalTransactionalInfo(moduleIdentifier, jmxAttributeForReporting).getModuleFactory();
78     }
79
80     public Map<ModuleIdentifier, Module> getAllModules() {
81         Map<ModuleIdentifier, Module> result = new HashMap<>();
82         for (ModuleInternalTransactionalInfo entry : commitMap.values()) {
83             ModuleIdentifier name = entry.getIdentifier();
84             result.put(name, entry.getProxiedModule());
85         }
86         return result;
87     }
88
89     public void put(final ModuleInternalTransactionalInfo moduleInternalTransactionalInfo) {
90         commitMap.put(moduleInternalTransactionalInfo.getIdentifier(), moduleInternalTransactionalInfo);
91     }
92
93     public ModuleInternalTransactionalInfo destroyModule(final ModuleIdentifier moduleIdentifier) {
94         ModuleInternalTransactionalInfo found = commitMap.remove(moduleIdentifier);
95         if (found == null) {
96             throw new IllegalStateException("Not found:" + moduleIdentifier);
97         }
98         if (found.hasOldModule()) {
99             unorderedDestroyedFromPreviousTransactions.add(found);
100         }
101         return found;
102     }
103
104     public void assertNotExists(final ModuleIdentifier moduleIdentifier) throws InstanceAlreadyExistsException {
105         if (commitMap.containsKey(moduleIdentifier)) {
106             throw new InstanceAlreadyExistsException("There is an instance registered with name " + moduleIdentifier);
107         }
108     }
109
110     public Collection<ModuleInternalTransactionalInfo> getAllInfos() {
111         return commitMap.values();
112     }
113
114     @Override
115     public void close() {
116         unorderedDestroyedFromPreviousTransactions.clear();
117     }
118 }