2 * Copyright (c) 2015 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 mBeanServer;
37 public JMXNotifierConfigRegistry(final ConfigRegistryImplMXBean delegate, final MBeanServer mBeanServer) {
38 this.delegate = delegate;
39 notifier = new NotifierMXBeanImpl();
40 this.mBeanServer = mBeanServer;
41 registerMBean(notifier, this.mBeanServer, 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) throws ConflictingVersionException, ValidationException {
64 final CommitStatus commitStatus = delegate.commitConfig(transactionControllerON);
65 notifier.notifyCommit(ObjectNameUtil.getTransactionName(transactionControllerON));
70 public List<ObjectName> getOpenConfigs() {
71 return delegate.getOpenConfigs();
75 public boolean isHealthy() {
76 return delegate.isHealthy();
80 public Set<String> getAvailableModuleNames() {
81 return delegate.getAvailableModuleNames();
85 public Set<ObjectName> lookupConfigBeans() {
86 return delegate.lookupConfigBeans();
90 public Set<ObjectName> lookupConfigBeans(final String moduleName) {
91 return delegate.lookupConfigBeans(moduleName);
95 public Set<ObjectName> lookupConfigBeans(final String moduleName, final String instanceName) {
96 return delegate.lookupConfigBeans(moduleName, instanceName);
100 public ObjectName lookupConfigBean(final String moduleName, final String instanceName) throws InstanceNotFoundException {
101 return delegate.lookupConfigBean(moduleName, instanceName);
105 public void checkConfigBeanExists(final ObjectName objectName) throws InstanceNotFoundException {
106 delegate.checkConfigBeanExists(objectName);
110 public Set<String> getAvailableModuleFactoryQNames() {
111 return delegate.getAvailableModuleFactoryQNames();
115 public Set<ObjectName> lookupRuntimeBeans() {
116 return delegate.lookupRuntimeBeans();
120 public Set<ObjectName> lookupRuntimeBeans(final String moduleName, final String instanceName) {
121 return delegate.lookupRuntimeBeans(moduleName, instanceName);
125 public ObjectName lookupConfigBeanByServiceInterfaceName(final String serviceInterfaceQName, final String refName) {
126 return delegate.lookupConfigBeanByServiceInterfaceName(serviceInterfaceQName, refName);
130 public Map<String, Map<String, ObjectName>> getServiceMapping() {
131 return delegate.getServiceMapping();
135 public Map<String, ObjectName> lookupServiceReferencesByServiceInterfaceName(final String serviceInterfaceQName) {
136 return delegate.lookupServiceReferencesByServiceInterfaceName(serviceInterfaceQName);
140 public Set<String> lookupServiceInterfaceNames(final ObjectName objectName) throws InstanceNotFoundException {
141 return delegate.lookupServiceInterfaceNames(objectName);
145 public String getServiceInterfaceName(final String namespace, final String localName) {
146 return delegate.getServiceInterfaceName(namespace, localName);
150 public ObjectName getServiceReference(final String serviceInterfaceQName, final String refName) throws InstanceNotFoundException {
151 return delegate.getServiceReference(serviceInterfaceQName, refName);
155 public void checkServiceReferenceExists(final ObjectName objectName) throws InstanceNotFoundException {
156 delegate.checkServiceReferenceExists(objectName);
160 public void close() {
162 mBeanServer.unregisterMBean(ConfigJMXNotification.OBJECT_NAME);
163 } catch (InstanceNotFoundException | MBeanRegistrationException e) {
164 throw new IllegalStateException("Notifier: " + ConfigJMXNotification.OBJECT_NAME + " not found in JMX when closing");
168 public interface NotifierMXBean {}
170 public static class NotifierMXBeanImpl extends NotificationBroadcasterSupport implements NotifierMXBean {
172 private void notifyCommit(final String transactionName) {
173 sendNotification(ConfigJMXNotification.afterCommit(this, "commit success " + transactionName));