Decouple config and netconf subsystems.
[controller.git] / opendaylight / config / config-manager / src / main / java / org / opendaylight / controller / config / manager / impl / jmx / JMXNotifierConfigRegistry.java
1 package org.opendaylight.controller.config.manager.impl.jmx;
2
3 import java.util.List;
4 import java.util.Map;
5 import java.util.Set;
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;
19
20 /**
21  * Thin wrapper over ConfigRegistry emitting JMX notifications
22  */
23 public class JMXNotifierConfigRegistry implements ConfigRegistryImplMXBean, AutoCloseable {
24
25     private final ConfigRegistryImplMXBean delegate;
26     private final NotifierMXBeanImpl notifier;
27     private final MBeanServer mBeanServer;
28
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);
34     }
35
36     private static void registerMBean(final Object instance, final MBeanServer mbs, final ObjectName on) {
37         try {
38             mbs.registerMBean(instance, on);
39         } catch (InstanceAlreadyExistsException | MBeanRegistrationException | NotCompliantMBeanException e) {
40             throw new IllegalStateException("Unable to register " + instance + " as " + on, e);
41         }
42     }
43
44     @Override
45     public long getVersion() {
46         return delegate.getVersion();
47     }
48
49     @Override
50     public ObjectName beginConfig() {
51         return delegate.beginConfig();
52     }
53
54     @Override
55     public CommitStatus commitConfig(final ObjectName transactionControllerON) throws ConflictingVersionException, ValidationException {
56         final CommitStatus commitStatus = delegate.commitConfig(transactionControllerON);
57         notifier.notifyCommit(ObjectNameUtil.getTransactionName(transactionControllerON));
58         return commitStatus;
59     }
60
61     @Override
62     public List<ObjectName> getOpenConfigs() {
63         return delegate.getOpenConfigs();
64     }
65
66     @Override
67     public boolean isHealthy() {
68         return delegate.isHealthy();
69     }
70
71     @Override
72     public Set<String> getAvailableModuleNames() {
73         return delegate.getAvailableModuleNames();
74     }
75
76     @Override
77     public Set<ObjectName> lookupConfigBeans() {
78         return delegate.lookupConfigBeans();
79     }
80
81     @Override
82     public Set<ObjectName> lookupConfigBeans(final String moduleName) {
83         return delegate.lookupConfigBeans(moduleName);
84     }
85
86     @Override
87     public Set<ObjectName> lookupConfigBeans(final String moduleName, final String instanceName) {
88         return delegate.lookupConfigBeans(moduleName, instanceName);
89     }
90
91     @Override
92     public ObjectName lookupConfigBean(final String moduleName, final String instanceName) throws InstanceNotFoundException {
93         return delegate.lookupConfigBean(moduleName, instanceName);
94     }
95
96     @Override
97     public void checkConfigBeanExists(final ObjectName objectName) throws InstanceNotFoundException {
98         delegate.checkConfigBeanExists(objectName);
99     }
100
101     @Override
102     public Set<String> getAvailableModuleFactoryQNames() {
103         return delegate.getAvailableModuleFactoryQNames();
104     }
105
106     @Override
107     public Set<ObjectName> lookupRuntimeBeans() {
108         return delegate.lookupRuntimeBeans();
109     }
110
111     @Override
112     public Set<ObjectName> lookupRuntimeBeans(final String moduleName, final String instanceName) {
113         return delegate.lookupRuntimeBeans(moduleName, instanceName);
114     }
115
116     @Override
117     public ObjectName lookupConfigBeanByServiceInterfaceName(final String serviceInterfaceQName, final String refName) {
118         return delegate.lookupConfigBeanByServiceInterfaceName(serviceInterfaceQName, refName);
119     }
120
121     @Override
122     public Map<String, Map<String, ObjectName>> getServiceMapping() {
123         return delegate.getServiceMapping();
124     }
125
126     @Override
127     public Map<String, ObjectName> lookupServiceReferencesByServiceInterfaceName(final String serviceInterfaceQName) {
128         return delegate.lookupServiceReferencesByServiceInterfaceName(serviceInterfaceQName);
129     }
130
131     @Override
132     public Set<String> lookupServiceInterfaceNames(final ObjectName objectName) throws InstanceNotFoundException {
133         return delegate.lookupServiceInterfaceNames(objectName);
134     }
135
136     @Override
137     public String getServiceInterfaceName(final String namespace, final String localName) {
138         return delegate.getServiceInterfaceName(namespace, localName);
139     }
140
141     @Override
142     public ObjectName getServiceReference(final String serviceInterfaceQName, final String refName) throws InstanceNotFoundException {
143         return delegate.getServiceReference(serviceInterfaceQName, refName);
144     }
145
146     @Override
147     public void checkServiceReferenceExists(final ObjectName objectName) throws InstanceNotFoundException {
148         delegate.checkServiceReferenceExists(objectName);
149     }
150
151     @Override
152     public void close() {
153         try {
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");
157         }
158     }
159
160     public interface NotifierMXBean {}
161
162     public static class NotifierMXBeanImpl extends NotificationBroadcasterSupport implements NotifierMXBean {
163
164         private void notifyCommit(final String transactionName) {
165             sendNotification(ConfigJMXNotification.afterCommit(this, "commit success " + transactionName));
166         }
167     }
168 }