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