1 package org.opendaylight.controller.config.manager.impl.jmx;
6 import javax.management.InstanceAlreadyExistsException;
7 import javax.management.InstanceNotFoundException;
8 import javax.management.MBeanRegistrationException;
9 import javax.management.MBeanServer;
10 import javax.management.NotCompliantMBeanException;
11 import javax.management.NotificationBroadcasterSupport;
12 import javax.management.ObjectName;
13 import org.opendaylight.controller.config.api.ConflictingVersionException;
14 import org.opendaylight.controller.config.api.ValidationException;
15 import org.opendaylight.controller.config.api.jmx.CommitStatus;
16 import org.opendaylight.controller.config.api.jmx.ObjectNameUtil;
17 import org.opendaylight.controller.config.api.jmx.notifications.ConfigJMXNotification;
18 import org.opendaylight.controller.config.manager.impl.ConfigRegistryImplMXBean;
21 * Thin wrapper over ConfigRegistry emitting JMX notifications
23 public class JMXNotifierConfigRegistry implements ConfigRegistryImplMXBean, AutoCloseable {
25 private final ConfigRegistryImplMXBean delegate;
26 private final NotifierMXBeanImpl notifier;
27 private final MBeanServer mBeanServer;
29 public JMXNotifierConfigRegistry(final ConfigRegistryImplMXBean delegate, final MBeanServer mBeanServer) {
30 this.delegate = delegate;
31 notifier = new NotifierMXBeanImpl();
32 this.mBeanServer = mBeanServer;
33 registerMBean(notifier, this.mBeanServer, ConfigJMXNotification.OBJECT_NAME);
36 private static void registerMBean(final Object instance, final MBeanServer mbs, final ObjectName on) {
38 mbs.registerMBean(instance, on);
39 } catch (InstanceAlreadyExistsException | MBeanRegistrationException | NotCompliantMBeanException e) {
40 throw new IllegalStateException("Unable to register " + instance + " as " + on, e);
45 public long getVersion() {
46 return delegate.getVersion();
50 public ObjectName beginConfig() {
51 return delegate.beginConfig();
55 public CommitStatus commitConfig(final ObjectName transactionControllerON) throws ConflictingVersionException, ValidationException {
56 final CommitStatus commitStatus = delegate.commitConfig(transactionControllerON);
57 notifier.notifyCommit(ObjectNameUtil.getTransactionName(transactionControllerON));
62 public List<ObjectName> getOpenConfigs() {
63 return delegate.getOpenConfigs();
67 public boolean isHealthy() {
68 return delegate.isHealthy();
72 public Set<String> getAvailableModuleNames() {
73 return delegate.getAvailableModuleNames();
77 public Set<ObjectName> lookupConfigBeans() {
78 return delegate.lookupConfigBeans();
82 public Set<ObjectName> lookupConfigBeans(final String moduleName) {
83 return delegate.lookupConfigBeans(moduleName);
87 public Set<ObjectName> lookupConfigBeans(final String moduleName, final String instanceName) {
88 return delegate.lookupConfigBeans(moduleName, instanceName);
92 public ObjectName lookupConfigBean(final String moduleName, final String instanceName) throws InstanceNotFoundException {
93 return delegate.lookupConfigBean(moduleName, instanceName);
97 public void checkConfigBeanExists(final ObjectName objectName) throws InstanceNotFoundException {
98 delegate.checkConfigBeanExists(objectName);
102 public Set<String> getAvailableModuleFactoryQNames() {
103 return delegate.getAvailableModuleFactoryQNames();
107 public Set<ObjectName> lookupRuntimeBeans() {
108 return delegate.lookupRuntimeBeans();
112 public Set<ObjectName> lookupRuntimeBeans(final String moduleName, final String instanceName) {
113 return delegate.lookupRuntimeBeans(moduleName, instanceName);
117 public ObjectName lookupConfigBeanByServiceInterfaceName(final String serviceInterfaceQName, final String refName) {
118 return delegate.lookupConfigBeanByServiceInterfaceName(serviceInterfaceQName, refName);
122 public Map<String, Map<String, ObjectName>> getServiceMapping() {
123 return delegate.getServiceMapping();
127 public Map<String, ObjectName> lookupServiceReferencesByServiceInterfaceName(final String serviceInterfaceQName) {
128 return delegate.lookupServiceReferencesByServiceInterfaceName(serviceInterfaceQName);
132 public Set<String> lookupServiceInterfaceNames(final ObjectName objectName) throws InstanceNotFoundException {
133 return delegate.lookupServiceInterfaceNames(objectName);
137 public String getServiceInterfaceName(final String namespace, final String localName) {
138 return delegate.getServiceInterfaceName(namespace, localName);
142 public ObjectName getServiceReference(final String serviceInterfaceQName, final String refName) throws InstanceNotFoundException {
143 return delegate.getServiceReference(serviceInterfaceQName, refName);
147 public void checkServiceReferenceExists(final ObjectName objectName) throws InstanceNotFoundException {
148 delegate.checkServiceReferenceExists(objectName);
152 public void close() {
154 mBeanServer.unregisterMBean(ConfigJMXNotification.OBJECT_NAME);
155 } catch (InstanceNotFoundException | MBeanRegistrationException e) {
156 throw new IllegalStateException("Notifier: " + ConfigJMXNotification.OBJECT_NAME + " not found in JMX when closing");
160 public interface NotifierMXBean {}
162 public static class NotifierMXBeanImpl extends NotificationBroadcasterSupport implements NotifierMXBean {
164 private void notifyCommit(final String transactionName) {
165 sendNotification(ConfigJMXNotification.afterCommit(this, "commit success " + transactionName));