2 * Copyright (c) 2015, 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
9 package org.opendaylight.controller.config.manager.impl.jmx;
11 import java.util.List;
14 import javax.management.InstanceAlreadyExistsException;
15 import javax.management.InstanceNotFoundException;
16 import javax.management.MBeanRegistrationException;
17 import javax.management.MBeanServer;
18 import javax.management.NotCompliantMBeanException;
19 import javax.management.NotificationBroadcasterSupport;
20 import javax.management.ObjectName;
21 import org.opendaylight.controller.config.api.ConflictingVersionException;
22 import org.opendaylight.controller.config.api.ValidationException;
23 import org.opendaylight.controller.config.api.jmx.CommitStatus;
24 import org.opendaylight.controller.config.api.jmx.ObjectNameUtil;
25 import org.opendaylight.controller.config.api.jmx.notifications.ConfigJMXNotification;
26 import org.opendaylight.controller.config.manager.impl.ConfigRegistryImplMXBean;
29 * Thin wrapper over ConfigRegistry emitting JMX notifications.
31 public class JMXNotifierConfigRegistry implements ConfigRegistryImplMXBean, AutoCloseable {
33 private final ConfigRegistryImplMXBean delegate;
34 private final NotifierMXBeanImpl notifier;
35 private final MBeanServer beanServer;
37 public JMXNotifierConfigRegistry(final ConfigRegistryImplMXBean delegate, final MBeanServer beanServer) {
38 this.delegate = delegate;
39 notifier = new NotifierMXBeanImpl();
40 this.beanServer = beanServer;
41 registerMBean(notifier, this.beanServer, ConfigJMXNotification.OBJECT_NAME);
44 private static void registerMBean(final Object instance, final MBeanServer mbs, final ObjectName on) {
46 mbs.registerMBean(instance, on);
47 } catch (InstanceAlreadyExistsException | MBeanRegistrationException | NotCompliantMBeanException e) {
48 throw new IllegalStateException("Unable to register " + instance + " as " + on, e);
53 public long getVersion() {
54 return delegate.getVersion();
58 public ObjectName beginConfig() {
59 return delegate.beginConfig();
63 public CommitStatus commitConfig(final ObjectName transactionControllerON)
64 throws ConflictingVersionException, ValidationException {
65 final CommitStatus commitStatus = delegate.commitConfig(transactionControllerON);
66 notifier.notifyCommit(ObjectNameUtil.getTransactionName(transactionControllerON));
71 public List<ObjectName> getOpenConfigs() {
72 return delegate.getOpenConfigs();
76 public boolean isHealthy() {
77 return delegate.isHealthy();
81 public Set<String> getAvailableModuleNames() {
82 return delegate.getAvailableModuleNames();
86 public Set<ObjectName> lookupConfigBeans() {
87 return delegate.lookupConfigBeans();
91 public Set<ObjectName> lookupConfigBeans(final String moduleName) {
92 return delegate.lookupConfigBeans(moduleName);
96 public Set<ObjectName> lookupConfigBeans(final String moduleName, final String instanceName) {
97 return delegate.lookupConfigBeans(moduleName, instanceName);
101 public ObjectName lookupConfigBean(final String moduleName, final String instanceName)
102 throws InstanceNotFoundException {
103 return delegate.lookupConfigBean(moduleName, instanceName);
107 public void checkConfigBeanExists(final ObjectName objectName) throws InstanceNotFoundException {
108 delegate.checkConfigBeanExists(objectName);
112 public Set<String> getAvailableModuleFactoryQNames() {
113 return delegate.getAvailableModuleFactoryQNames();
117 public Set<ObjectName> lookupRuntimeBeans() {
118 return delegate.lookupRuntimeBeans();
122 public Set<ObjectName> lookupRuntimeBeans(final String moduleName, final String instanceName) {
123 return delegate.lookupRuntimeBeans(moduleName, instanceName);
127 public ObjectName lookupConfigBeanByServiceInterfaceName(final String serviceInterfaceQName, final String refName) {
128 return delegate.lookupConfigBeanByServiceInterfaceName(serviceInterfaceQName, refName);
132 public Map<String, Map<String, ObjectName>> getServiceMapping() {
133 return delegate.getServiceMapping();
137 public Map<String, ObjectName> lookupServiceReferencesByServiceInterfaceName(final String serviceInterfaceQName) {
138 return delegate.lookupServiceReferencesByServiceInterfaceName(serviceInterfaceQName);
142 public Set<String> lookupServiceInterfaceNames(final ObjectName objectName) throws InstanceNotFoundException {
143 return delegate.lookupServiceInterfaceNames(objectName);
147 public String getServiceInterfaceName(final String namespace, final String localName) {
148 return delegate.getServiceInterfaceName(namespace, localName);
152 public ObjectName getServiceReference(final String serviceInterfaceQName, final String refName)
153 throws InstanceNotFoundException {
154 return delegate.getServiceReference(serviceInterfaceQName, refName);
158 public void checkServiceReferenceExists(final ObjectName objectName) throws InstanceNotFoundException {
159 delegate.checkServiceReferenceExists(objectName);
163 public void close() {
165 beanServer.unregisterMBean(ConfigJMXNotification.OBJECT_NAME);
166 } catch (InstanceNotFoundException | MBeanRegistrationException e) {
167 throw new IllegalStateException(
168 "Notifier: " + ConfigJMXNotification.OBJECT_NAME + " not found in JMX when closing", e);
172 public interface NotifierMXBean {
175 public static class NotifierMXBeanImpl extends NotificationBroadcasterSupport implements NotifierMXBean {
177 private void notifyCommit(final String transactionName) {
178 sendNotification(ConfigJMXNotification.afterCommit(this, "commit success " + transactionName));