2 * Copyright (c) 2013 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
8 package org.opendaylight.controller.config.util;
10 import java.util.Arrays;
11 import java.util.List;
14 import javax.management.AttributeNotFoundException;
15 import javax.management.InstanceNotFoundException;
16 import javax.management.JMException;
17 import javax.management.JMX;
18 import javax.management.MBeanException;
19 import javax.management.MBeanServer;
20 import javax.management.ObjectInstance;
21 import javax.management.ObjectName;
22 import javax.management.ReflectionException;
23 import org.opendaylight.controller.config.api.ConflictingVersionException;
24 import org.opendaylight.controller.config.api.ValidationException;
25 import org.opendaylight.controller.config.api.jmx.CommitStatus;
26 import org.opendaylight.controller.config.api.jmx.ConfigRegistryMXBean;
27 import org.opendaylight.controller.config.api.jmx.ObjectNameUtil;
28 import org.opendaylight.controller.config.api.jmx.ServiceReferenceMXBean;
29 import org.opendaylight.controller.config.api.jmx.constants.ConfigRegistryConstants;
31 public class ConfigRegistryJMXClient implements ConfigRegistryClient {
32 private final ConfigRegistryMXBean configRegistryMXBeanProxy;
33 private final ObjectName configRegistryON;
34 private final MBeanServer configMBeanServer;
36 public ConfigRegistryJMXClient(final MBeanServer configMBeanServer) {
37 this(configMBeanServer, OBJECT_NAME);
40 private ConfigRegistryJMXClient(final MBeanServer configMBeanServer, final ObjectName configRegistryON) {
41 this.configMBeanServer = configMBeanServer;
42 this.configRegistryON = configRegistryON;
43 Set<ObjectInstance> searchResult = configMBeanServer.queryMBeans(configRegistryON, null);
44 if (searchResult.size() != 1) {
45 throw new IllegalStateException("Config registry not found");
47 configRegistryMXBeanProxy = JMX.newMXBeanProxy(configMBeanServer, configRegistryON, ConfigRegistryMXBean.class,
51 public static ConfigRegistryJMXClient createWithoutNotifications(final MBeanServer configMBeanServer) {
52 return new ConfigRegistryJMXClient(configMBeanServer, ConfigRegistryConstants.OBJECT_NAME_NO_NOTIFICATIONS);
56 public ConfigTransactionJMXClient createTransaction() {
57 ObjectName configTransactionControllerON = beginConfig();
58 return getConfigTransactionClient(configTransactionControllerON);
62 public ConfigTransactionJMXClient getConfigTransactionClient(
63 final String transactionName) {
64 ObjectName objectName = ObjectNameUtil
65 .createTransactionControllerON(transactionName);
66 return getConfigTransactionClient(objectName);
70 public ConfigTransactionJMXClient getConfigTransactionClient(
71 final ObjectName objectName) {
72 return new ConfigTransactionJMXClient(configRegistryMXBeanProxy, objectName,
77 * Usage of this method indicates error as config JMX uses solely MXBeans.
78 * Use {@link #newMXBeanProxy(javax.management.ObjectName, Class)}
79 * or {@link JMX#newMBeanProxy(javax.management.MBeanServerConnection, javax.management.ObjectName, Class)}
80 * This method will be removed soon.
83 public <T> T newMBeanProxy(final ObjectName on, final Class<T> clazz) {
84 ObjectName onObj = translateServiceRefIfPossible(on, clazz, configMBeanServer);
85 return JMX.newMBeanProxy(configMBeanServer, onObj, clazz);
88 static ObjectName translateServiceRefIfPossible(final ObjectName on, final Class<?> clazz, final MBeanServer configMBeanServer) {
89 ObjectName onObj = on;
90 if (ObjectNameUtil.isServiceReference(onObj) && !clazz.equals(ServiceReferenceMXBean.class)) {
91 ServiceReferenceMXBean proxy = JMX.newMXBeanProxy(configMBeanServer, onObj, ServiceReferenceMXBean.class);
92 onObj = proxy.getCurrentImplementation();
98 public <T> T newMXBeanProxy(final ObjectName on, final Class<T> clazz) {
99 return JMX.newMXBeanProxy(configMBeanServer, on, clazz);
103 public ObjectName beginConfig() {
104 return configRegistryMXBeanProxy.beginConfig();
108 public CommitStatus commitConfig(final ObjectName transactionControllerON)
109 throws ConflictingVersionException, ValidationException {
110 return configRegistryMXBeanProxy.commitConfig(transactionControllerON);
114 public List<ObjectName> getOpenConfigs() {
115 return configRegistryMXBeanProxy.getOpenConfigs();
119 public long getVersion() {
121 return (Long) configMBeanServer.getAttribute(configRegistryON,
123 } catch (final JMException e) {
124 throw new RuntimeException(e);
129 public Set<String> getAvailableModuleNames() {
130 return configRegistryMXBeanProxy.getAvailableModuleNames();
134 public boolean isHealthy() {
135 return configRegistryMXBeanProxy.isHealthy();
139 public Set<ObjectName> lookupConfigBeans() {
140 return configRegistryMXBeanProxy.lookupConfigBeans();
144 public Set<ObjectName> lookupConfigBeans(final String moduleName) {
145 return configRegistryMXBeanProxy.lookupConfigBeans(moduleName);
149 public Set<ObjectName> lookupConfigBeans(final String moduleName,
150 final String instanceName) {
151 return configRegistryMXBeanProxy.lookupConfigBeans(moduleName, instanceName);
155 public ObjectName lookupConfigBean(final String moduleName, final String instanceName)
156 throws InstanceNotFoundException {
157 return configRegistryMXBeanProxy.lookupConfigBean(moduleName, instanceName);
161 public Set<ObjectName> lookupRuntimeBeans() {
162 return configRegistryMXBeanProxy.lookupRuntimeBeans();
166 public Set<ObjectName> lookupRuntimeBeans(final String ifcName,
167 final String instanceName) {
168 return configRegistryMXBeanProxy.lookupRuntimeBeans(ifcName, instanceName);
172 public void checkConfigBeanExists(final ObjectName objectName) throws InstanceNotFoundException {
173 configRegistryMXBeanProxy.checkConfigBeanExists(objectName);
177 public ObjectName lookupConfigBeanByServiceInterfaceName(final String serviceInterfaceQName, final String refName) {
178 return configRegistryMXBeanProxy.lookupConfigBeanByServiceInterfaceName(serviceInterfaceQName, refName);
182 public Map<String, Map<String, ObjectName>> getServiceMapping() {
183 return configRegistryMXBeanProxy.getServiceMapping();
187 public Map<String, ObjectName> lookupServiceReferencesByServiceInterfaceName(final String serviceInterfaceQName) {
188 return configRegistryMXBeanProxy.lookupServiceReferencesByServiceInterfaceName(serviceInterfaceQName);
192 public Set<String> lookupServiceInterfaceNames(final ObjectName objectName) throws InstanceNotFoundException {
193 return configRegistryMXBeanProxy.lookupServiceInterfaceNames(objectName);
197 public String getServiceInterfaceName(final String namespace, final String localName) {
198 return configRegistryMXBeanProxy.getServiceInterfaceName(namespace, localName);
202 public Object invokeMethod(final ObjectName on, final String name, final Object[] params,
203 final String[] signature) {
205 return configMBeanServer.invoke(on, name, params, signature);
206 } catch (InstanceNotFoundException | ReflectionException
207 | MBeanException e) {
208 throw new RuntimeException("Unable to invoke operation " + name
209 + " on " + on + " with attributes "
210 + Arrays.toString(params) + " and signature "
211 + Arrays.toString(signature), e);
216 public Object getAttributeCurrentValue(final ObjectName on, final String attributeName) {
218 return configMBeanServer.getAttribute(on, attributeName);
219 } catch (AttributeNotFoundException | InstanceNotFoundException
220 | MBeanException | ReflectionException e) {
221 throw new RuntimeException("Unable to get attribute "
222 + attributeName + " for " + on + ". Available beans: " + lookupConfigBeans(), e);
227 public Set<String> getAvailableModuleFactoryQNames() {
228 return configRegistryMXBeanProxy.getAvailableModuleFactoryQNames();
232 public ObjectName getServiceReference(final String serviceInterfaceQName, final String refName) throws InstanceNotFoundException {
233 return configRegistryMXBeanProxy.getServiceReference(serviceInterfaceQName, refName);
237 public void checkServiceReferenceExists(final ObjectName objectName) throws InstanceNotFoundException {
238 configRegistryMXBeanProxy.checkServiceReferenceExists(objectName);