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.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;
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;
31 * Represents modules to be committed.
33 class ModulesHolder implements TransactionHolder {
34 private final String transactionName;
36 private final Map<ModuleIdentifier, ModuleInternalTransactionalInfo> commitMap = new HashMap<>();
39 private final Set<ModuleInternalTransactionalInfo> unorderedDestroyedFromPreviousTransactions = new HashSet<>();
41 ModulesHolder(String transactionName) {
42 this.transactionName = transactionName;
46 public CommitInfo toCommitInfo() {
47 List<DestroyedModule> orderedDestroyedFromPreviousTransactions = new ArrayList<>(
48 unorderedDestroyedFromPreviousTransactions.size());
49 for (ModuleInternalTransactionalInfo toBeDestroyed : unorderedDestroyedFromPreviousTransactions) {
50 orderedDestroyedFromPreviousTransactions.add(toBeDestroyed
51 .toDestroyedModule());
53 Collections.sort(orderedDestroyedFromPreviousTransactions);
54 return new CommitInfo(orderedDestroyedFromPreviousTransactions,
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;
71 public Module findModule(ModuleIdentifier moduleIdentifier,
72 JmxAttribute jmxAttributeForReporting) {
73 return findModuleInternalTransactionalInfo(moduleIdentifier,
74 jmxAttributeForReporting).getModule();
78 public ModuleFactory findModuleFactory(ModuleIdentifier moduleIdentifier,
79 JmxAttribute jmxAttributeForReporting) {
80 return findModuleInternalTransactionalInfo(moduleIdentifier,
81 jmxAttributeForReporting).getModuleFactory();
85 public Map<ModuleIdentifier, Module> getAllModules() {
86 Map<ModuleIdentifier, Module> result = new HashMap<>();
87 for (ModuleInternalTransactionalInfo entry : commitMap.values()) {
88 ModuleIdentifier name = entry.getName();
89 result.put(name, entry.getModule());
96 ModuleInternalTransactionalInfo moduleInternalTransactionalInfo) {
97 commitMap.put(moduleInternalTransactionalInfo.getName(),
98 moduleInternalTransactionalInfo);
102 public ModuleInternalTransactionalInfo destroyModule(
103 ModuleIdentifier moduleIdentifier) {
104 ModuleInternalTransactionalInfo found = commitMap
105 .remove(moduleIdentifier);
107 throw new IllegalStateException("Not found:" + moduleIdentifier);
108 if (found.hasOldModule()) {
109 unorderedDestroyedFromPreviousTransactions.add(found);
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);
123 public Collection<ModuleInternalTransactionalInfo> getAllInfos(){
124 return commitMap.values();