/* * Copyright (c) 2013, 2017 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.controller.config.manager.impl; import java.io.Closeable; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import javax.management.InstanceAlreadyExistsException; import javax.management.InstanceNotFoundException; import javax.management.ObjectName; import org.opendaylight.controller.config.api.LookupRegistry; import org.opendaylight.controller.config.api.jmx.ObjectNameUtil; import org.opendaylight.controller.config.manager.impl.jmx.TransactionJMXRegistrator; import org.opendaylight.controller.config.manager.impl.jmx.TransactionModuleJMXRegistrator; import org.opendaylight.controller.config.manager.impl.util.LookupBeansUtil; import org.opendaylight.controller.config.manager.impl.util.ModuleQNameUtil; import org.opendaylight.controller.config.spi.ModuleFactory; import org.osgi.framework.BundleContext; /** * Responsible for creating TransactionJMXRegistrator, registering transaction * and all its beans, lookup of beans, closing of TransactionJMXRegistrator. */ class ConfigTransactionLookupRegistry implements LookupRegistry, Closeable { private final TransactionJMXRegistrator transactionJMXRegistrator; private final TransactionIdentifier transactionIdentifier; private final TransactionModuleJMXRegistrator txModuleJMXRegistrator; private final Map> allCurrentFactories; interface TransactionJMXRegistratorFactory { TransactionJMXRegistrator create(); } ConfigTransactionLookupRegistry(final TransactionIdentifier transactionIdentifier, final TransactionJMXRegistratorFactory factory, final Map> allCurrentFactories) { this.transactionIdentifier = transactionIdentifier; this.transactionJMXRegistrator = factory.create(); this.txModuleJMXRegistrator = transactionJMXRegistrator.createTransactionModuleJMXRegistrator(); this.allCurrentFactories = allCurrentFactories; } private void checkTransactionName(final ObjectName objectName) { String foundTransactionName = ObjectNameUtil.getTransactionName(objectName); if (!transactionIdentifier.getName().equals(foundTransactionName)) { throw new IllegalArgumentException("Wrong transaction name " + objectName); } } /** * {@inheritDoc} */ @Override public Set lookupConfigBeans() { return lookupConfigBeans("*", "*"); } /** * {@inheritDoc} */ @Override public Set lookupConfigBeans(final String moduleName) { return lookupConfigBeans(moduleName, "*"); } /** * {@inheritDoc} */ @Override public Set lookupConfigBeans(final String moduleName, final String instanceName) { ObjectName namePattern = ObjectNameUtil.createModulePattern(moduleName, instanceName, transactionIdentifier.getName()); return txModuleJMXRegistrator.queryNames(namePattern, null); } /** * {@inheritDoc} */ @Override public ObjectName lookupConfigBean(final String moduleName, final String instanceName) throws InstanceNotFoundException { return LookupBeansUtil.lookupConfigBean(this, moduleName, instanceName); } @Override public void checkConfigBeanExists(final ObjectName objectName) throws InstanceNotFoundException { ObjectNameUtil.checkDomain(objectName); ObjectNameUtil.checkType(objectName, ObjectNameUtil.TYPE_MODULE); checkTransactionName(objectName); // make sure exactly one match is found: LookupBeansUtil.lookupConfigBean(this, ObjectNameUtil.getFactoryName(objectName), ObjectNameUtil.getInstanceName(objectName)); } TransactionIdentifier getTransactionIdentifier() { return transactionIdentifier; } TransactionModuleJMXRegistrator getTxModuleJMXRegistrator() { return txModuleJMXRegistrator; } @Override public void close() { transactionJMXRegistrator.close(); } public void registerMBean(final ConfigTransactionControllerInternal transactionController, final ObjectName controllerObjectName) throws InstanceAlreadyExistsException { transactionJMXRegistrator.registerMBean(transactionController, controllerObjectName); } @Override public Set getAvailableModuleFactoryQNames() { return ModuleQNameUtil.getQNames(allCurrentFactories); } /** * {@inheritDoc} */ @Override public Set lookupRuntimeBeans() { return lookupRuntimeBeans("*", "*"); } /** * {@inheritDoc} */ @Override public Set lookupRuntimeBeans(final String moduleName, final String instanceName) { String finalModuleName = moduleName == null ? "*" : moduleName; String finalInstanceName = instanceName == null ? "*" : instanceName; ObjectName namePattern = ObjectNameUtil.createRuntimeBeanPattern(finalModuleName, finalInstanceName); return transactionJMXRegistrator.queryNames(namePattern, null); } @Override public String toString() { return "ConfigTransactionLookupRegistry{" + "transactionIdentifier=" + transactionIdentifier + '}'; } }