2 * Copyright (c) 2013, 2017 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 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;
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;
29 * Represents modules to be committed.
31 class ModulesHolder implements AutoCloseable {
32 private final TransactionIdentifier transactionIdentifier;
34 private final Map<ModuleIdentifier, ModuleInternalTransactionalInfo> commitMap = new HashMap<>();
37 private final Set<ModuleInternalTransactionalInfo> unorderedDestroyedFromPreviousTransactions = new HashSet<>();
39 ModulesHolder(final TransactionIdentifier transactionIdentifier) {
40 this.transactionIdentifier = transactionIdentifier;
43 public CommitInfo toCommitInfo() {
44 List<DestroyedModule> orderedDestroyedFromPreviousTransactions = new ArrayList<>(
45 unorderedDestroyedFromPreviousTransactions.size());
46 for (ModuleInternalTransactionalInfo toBeDestroyed : unorderedDestroyedFromPreviousTransactions) {
47 orderedDestroyedFromPreviousTransactions.add(toBeDestroyed.toDestroyedModule());
49 Collections.sort(orderedDestroyedFromPreviousTransactions);
50 return new CommitInfo(orderedDestroyedFromPreviousTransactions, commitMap);
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;
62 public ModuleInternalTransactionalInfo findModuleInternalTransactionalInfo(
63 final ModuleIdentifier moduleIdentifier) {
64 ModuleInternalTransactionalInfo found = commitMap.get(moduleIdentifier);
66 throw new IllegalStateException("Not found:" + moduleIdentifier);
71 public Module findModule(final ModuleIdentifier moduleIdentifier, final JmxAttribute jmxAttributeForReporting) {
72 return findModuleInternalTransactionalInfo(moduleIdentifier, jmxAttributeForReporting).getProxiedModule();
75 public ModuleFactory findModuleFactory(final ModuleIdentifier moduleIdentifier,
76 final JmxAttribute jmxAttributeForReporting) {
77 return findModuleInternalTransactionalInfo(moduleIdentifier, jmxAttributeForReporting).getModuleFactory();
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());
89 public void put(final ModuleInternalTransactionalInfo moduleInternalTransactionalInfo) {
90 commitMap.put(moduleInternalTransactionalInfo.getIdentifier(), moduleInternalTransactionalInfo);
93 public ModuleInternalTransactionalInfo destroyModule(final ModuleIdentifier moduleIdentifier) {
94 ModuleInternalTransactionalInfo found = commitMap.remove(moduleIdentifier);
96 throw new IllegalStateException("Not found:" + moduleIdentifier);
98 if (found.hasOldModule()) {
99 unorderedDestroyedFromPreviousTransactions.add(found);
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);
110 public Collection<ModuleInternalTransactionalInfo> getAllInfos() {
111 return commitMap.values();
115 public void close() {
116 unorderedDestroyedFromPreviousTransactions.clear();