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