Merge "Cleanup RpcRoutingStrategy definition"
[controller.git] / opendaylight / config / config-util / src / main / java / org / opendaylight / controller / config / util / ConfigRegistryJMXClient.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.controller.config.util;
9
10 import org.opendaylight.controller.config.api.ConflictingVersionException;
11 import org.opendaylight.controller.config.api.ValidationException;
12 import org.opendaylight.controller.config.api.jmx.CommitStatus;
13 import org.opendaylight.controller.config.api.jmx.ConfigRegistryMXBean;
14 import org.opendaylight.controller.config.api.jmx.ObjectNameUtil;
15
16 import javax.management.AttributeNotFoundException;
17 import javax.management.InstanceNotFoundException;
18 import javax.management.JMException;
19 import javax.management.JMX;
20 import javax.management.MBeanException;
21 import javax.management.MBeanServer;
22 import javax.management.ObjectInstance;
23 import javax.management.ObjectName;
24 import javax.management.ReflectionException;
25 import java.util.Arrays;
26 import java.util.List;
27 import java.util.Map;
28 import java.util.Set;
29 import org.opendaylight.controller.config.api.jmx.ServiceReferenceMXBean;
30
31 public class ConfigRegistryJMXClient implements ConfigRegistryClient {
32     private final ConfigRegistryMXBean configRegistryMXBeanProxy;
33     private final ObjectName configRegistryON;
34     private final MBeanServer configMBeanServer;
35
36     public ConfigRegistryJMXClient(MBeanServer configMBeanServer) {
37         this.configMBeanServer = configMBeanServer;
38         configRegistryON = OBJECT_NAME;
39         Set<ObjectInstance> searchResult = configMBeanServer.queryMBeans(
40                 configRegistryON, null);
41         if (!(searchResult.size() == 1)) {
42             throw new IllegalStateException("Config registry not found");
43         }
44         configRegistryMXBeanProxy = JMX.newMXBeanProxy(configMBeanServer, configRegistryON, ConfigRegistryMXBean.class,
45                 false);
46     }
47
48     @Override
49     public ConfigTransactionJMXClient createTransaction() {
50         ObjectName configTransactionControllerON = beginConfig();
51         return getConfigTransactionClient(configTransactionControllerON);
52     }
53
54     @Override
55     public ConfigTransactionJMXClient getConfigTransactionClient(
56             String transactionName) {
57         ObjectName objectName = ObjectNameUtil
58                 .createTransactionControllerON(transactionName);
59         return getConfigTransactionClient(objectName);
60     }
61
62     @Override
63     public ConfigTransactionJMXClient getConfigTransactionClient(
64             ObjectName objectName) {
65         return new ConfigTransactionJMXClient(configRegistryMXBeanProxy, objectName,
66                 configMBeanServer);
67     }
68
69     /**
70      * Usage of this method indicates error as config JMX uses solely MXBeans.
71      * Use {@link #newMXBeanProxy(javax.management.ObjectName, Class)}
72      * or {@link JMX#newMBeanProxy(javax.management.MBeanServerConnection, javax.management.ObjectName, Class)}
73      * This method will be removed soon.
74      */
75     @Deprecated
76     public <T> T newMBeanProxy(ObjectName on, Class<T> clazz) {
77         ObjectName onObj = translateServiceRefIfPossible(on, clazz, configMBeanServer);
78         return JMX.newMBeanProxy(configMBeanServer, onObj, clazz);
79     }
80
81     static  ObjectName translateServiceRefIfPossible(ObjectName on, Class<?> clazz, MBeanServer configMBeanServer) {
82         ObjectName onObj = on;
83         if (ObjectNameUtil.isServiceReference(onObj) && clazz.equals(ServiceReferenceMXBean.class) == false) {
84             ServiceReferenceMXBean proxy = JMX.newMXBeanProxy(configMBeanServer, onObj, ServiceReferenceMXBean.class);
85             onObj = proxy.getCurrentImplementation();
86         }
87         return onObj;
88     }
89
90
91     public <T> T newMXBeanProxy(ObjectName on, Class<T> clazz) {
92         return JMX.newMXBeanProxy(configMBeanServer, on, clazz);
93     }
94
95     @Override
96     public ObjectName beginConfig() {
97         return configRegistryMXBeanProxy.beginConfig();
98     }
99
100     @Override
101     public CommitStatus commitConfig(ObjectName transactionControllerON)
102             throws ConflictingVersionException, ValidationException {
103         return configRegistryMXBeanProxy.commitConfig(transactionControllerON);
104     }
105
106     @Override
107     public List<ObjectName> getOpenConfigs() {
108         return configRegistryMXBeanProxy.getOpenConfigs();
109     }
110
111     @Override
112     public long getVersion() {
113         try {
114             return (Long) configMBeanServer.getAttribute(configRegistryON,
115                     "Version");
116         } catch (JMException e) {
117             throw new RuntimeException(e);
118         }
119     }
120
121     @Override
122     public Set<String> getAvailableModuleNames() {
123         return configRegistryMXBeanProxy.getAvailableModuleNames();
124     }
125
126     @Override
127     public boolean isHealthy() {
128         return configRegistryMXBeanProxy.isHealthy();
129     }
130
131     @Override
132     public Set<ObjectName> lookupConfigBeans() {
133         return configRegistryMXBeanProxy.lookupConfigBeans();
134     }
135
136     @Override
137     public Set<ObjectName> lookupConfigBeans(String moduleName) {
138         return configRegistryMXBeanProxy.lookupConfigBeans(moduleName);
139     }
140
141     @Override
142     public Set<ObjectName> lookupConfigBeans(String moduleName,
143             String instanceName) {
144         return configRegistryMXBeanProxy.lookupConfigBeans(moduleName, instanceName);
145     }
146
147     @Override
148     public ObjectName lookupConfigBean(String moduleName, String instanceName)
149             throws InstanceNotFoundException {
150         return configRegistryMXBeanProxy.lookupConfigBean(moduleName, instanceName);
151     }
152
153     @Override
154     public Set<ObjectName> lookupRuntimeBeans() {
155         return configRegistryMXBeanProxy.lookupRuntimeBeans();
156     }
157
158     @Override
159     public Set<ObjectName> lookupRuntimeBeans(String ifcName,
160             String instanceName) {
161         return configRegistryMXBeanProxy.lookupRuntimeBeans(ifcName, instanceName);
162     }
163
164     @Override
165     public void checkConfigBeanExists(ObjectName objectName) throws InstanceNotFoundException {
166         configRegistryMXBeanProxy.checkConfigBeanExists(objectName);
167     }
168
169     @Override
170     public ObjectName lookupConfigBeanByServiceInterfaceName(String serviceInterfaceQName, String refName) {
171         return configRegistryMXBeanProxy.lookupConfigBeanByServiceInterfaceName(serviceInterfaceQName, refName);
172     }
173
174     @Override
175     public Map<String, Map<String, ObjectName>> getServiceMapping() {
176         return configRegistryMXBeanProxy.getServiceMapping();
177     }
178
179     @Override
180     public Map<String, ObjectName> lookupServiceReferencesByServiceInterfaceName(String serviceInterfaceQName) {
181         return configRegistryMXBeanProxy.lookupServiceReferencesByServiceInterfaceName(serviceInterfaceQName);
182     }
183
184     @Override
185     public Set<String> lookupServiceInterfaceNames(ObjectName objectName) throws InstanceNotFoundException {
186         return configRegistryMXBeanProxy.lookupServiceInterfaceNames(objectName);
187     }
188
189     @Override
190     public String getServiceInterfaceName(String namespace, String localName) {
191         return configRegistryMXBeanProxy.getServiceInterfaceName(namespace, localName);
192     }
193
194     @Override
195     public Object invokeMethod(ObjectName on, String name, Object[] params,
196             String[] signature) {
197         try {
198             return configMBeanServer.invoke(on, name, params, signature);
199         } catch (InstanceNotFoundException | ReflectionException
200                 | MBeanException e) {
201             throw new RuntimeException("Unable to invoke operation " + name
202                     + " on " + on + " with attributes "
203                     + Arrays.toString(params) + " and signature "
204                     + Arrays.toString(signature), e);
205         }
206     }
207
208     @Override
209     public Object getAttributeCurrentValue(ObjectName on, String attributeName) {
210         try {
211             return configMBeanServer.getAttribute(on, attributeName);
212         } catch (AttributeNotFoundException | InstanceNotFoundException
213                 | MBeanException | ReflectionException e) {
214             throw new RuntimeException("Unable to get attribute "
215                     + attributeName + " for " + on, e);
216         }
217     }
218
219     @Override
220     public Set<String> getAvailableModuleFactoryQNames() {
221         return configRegistryMXBeanProxy.getAvailableModuleFactoryQNames();
222     }
223
224     @Override
225     public ObjectName getServiceReference(String serviceInterfaceQName, String refName) throws InstanceNotFoundException {
226         return configRegistryMXBeanProxy.getServiceReference(serviceInterfaceQName, refName);
227     }
228
229     @Override
230     public void checkServiceReferenceExists(ObjectName objectName) throws InstanceNotFoundException {
231         configRegistryMXBeanProxy.checkServiceReferenceExists(objectName);
232     }
233 }