Remove yang-test
[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 import org.opendaylight.controller.config.api.jmx.constants.ConfigRegistryConstants;
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(final MBeanServer configMBeanServer) {
37         this(configMBeanServer, OBJECT_NAME);
38     }
39
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");
46         }
47         configRegistryMXBeanProxy = JMX.newMXBeanProxy(configMBeanServer, configRegistryON, ConfigRegistryMXBean.class,
48                 false);
49     }
50
51     public static ConfigRegistryJMXClient createWithoutNotifications(final MBeanServer configMBeanServer) {
52         return new ConfigRegistryJMXClient(configMBeanServer, ConfigRegistryConstants.OBJECT_NAME_NO_NOTIFICATIONS);
53     }
54
55     @Override
56     public ConfigTransactionJMXClient createTransaction() {
57         ObjectName configTransactionControllerON = beginConfig();
58         return getConfigTransactionClient(configTransactionControllerON);
59     }
60
61     @Override
62     public ConfigTransactionJMXClient getConfigTransactionClient(
63             final String transactionName) {
64         ObjectName objectName = ObjectNameUtil
65                 .createTransactionControllerON(transactionName);
66         return getConfigTransactionClient(objectName);
67     }
68
69     @Override
70     public ConfigTransactionJMXClient getConfigTransactionClient(
71             final ObjectName objectName) {
72         return new ConfigTransactionJMXClient(configRegistryMXBeanProxy, objectName,
73                 configMBeanServer);
74     }
75
76     /**
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.
81      */
82     @Deprecated
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);
86     }
87
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();
93         }
94         return onObj;
95     }
96
97
98     public <T> T newMXBeanProxy(final ObjectName on, final Class<T> clazz) {
99         return JMX.newMXBeanProxy(configMBeanServer, on, clazz);
100     }
101
102     @Override
103     public ObjectName beginConfig() {
104         return configRegistryMXBeanProxy.beginConfig();
105     }
106
107     @Override
108     public CommitStatus commitConfig(final ObjectName transactionControllerON)
109             throws ConflictingVersionException, ValidationException {
110         return configRegistryMXBeanProxy.commitConfig(transactionControllerON);
111     }
112
113     @Override
114     public List<ObjectName> getOpenConfigs() {
115         return configRegistryMXBeanProxy.getOpenConfigs();
116     }
117
118     @Override
119     public long getVersion() {
120         try {
121             return (Long) configMBeanServer.getAttribute(configRegistryON,
122                     "Version");
123         } catch (final JMException e) {
124             throw new RuntimeException(e);
125         }
126     }
127
128     @Override
129     public Set<String> getAvailableModuleNames() {
130         return configRegistryMXBeanProxy.getAvailableModuleNames();
131     }
132
133     @Override
134     public boolean isHealthy() {
135         return configRegistryMXBeanProxy.isHealthy();
136     }
137
138     @Override
139     public Set<ObjectName> lookupConfigBeans() {
140         return configRegistryMXBeanProxy.lookupConfigBeans();
141     }
142
143     @Override
144     public Set<ObjectName> lookupConfigBeans(final String moduleName) {
145         return configRegistryMXBeanProxy.lookupConfigBeans(moduleName);
146     }
147
148     @Override
149     public Set<ObjectName> lookupConfigBeans(final String moduleName,
150             final String instanceName) {
151         return configRegistryMXBeanProxy.lookupConfigBeans(moduleName, instanceName);
152     }
153
154     @Override
155     public ObjectName lookupConfigBean(final String moduleName, final String instanceName)
156             throws InstanceNotFoundException {
157         return configRegistryMXBeanProxy.lookupConfigBean(moduleName, instanceName);
158     }
159
160     @Override
161     public Set<ObjectName> lookupRuntimeBeans() {
162         return configRegistryMXBeanProxy.lookupRuntimeBeans();
163     }
164
165     @Override
166     public Set<ObjectName> lookupRuntimeBeans(final String ifcName,
167             final String instanceName) {
168         return configRegistryMXBeanProxy.lookupRuntimeBeans(ifcName, instanceName);
169     }
170
171     @Override
172     public void checkConfigBeanExists(final ObjectName objectName) throws InstanceNotFoundException {
173         configRegistryMXBeanProxy.checkConfigBeanExists(objectName);
174     }
175
176     @Override
177     public ObjectName lookupConfigBeanByServiceInterfaceName(final String serviceInterfaceQName, final String refName) {
178         return configRegistryMXBeanProxy.lookupConfigBeanByServiceInterfaceName(serviceInterfaceQName, refName);
179     }
180
181     @Override
182     public Map<String, Map<String, ObjectName>> getServiceMapping() {
183         return configRegistryMXBeanProxy.getServiceMapping();
184     }
185
186     @Override
187     public Map<String, ObjectName> lookupServiceReferencesByServiceInterfaceName(final String serviceInterfaceQName) {
188         return configRegistryMXBeanProxy.lookupServiceReferencesByServiceInterfaceName(serviceInterfaceQName);
189     }
190
191     @Override
192     public Set<String> lookupServiceInterfaceNames(final ObjectName objectName) throws InstanceNotFoundException {
193         return configRegistryMXBeanProxy.lookupServiceInterfaceNames(objectName);
194     }
195
196     @Override
197     public String getServiceInterfaceName(final String namespace, final String localName) {
198         return configRegistryMXBeanProxy.getServiceInterfaceName(namespace, localName);
199     }
200
201     @Override
202     public Object invokeMethod(final ObjectName on, final String name, final Object[] params,
203             final String[] signature) {
204         try {
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);
212         }
213     }
214
215     @Override
216     public Object getAttributeCurrentValue(final ObjectName on, final String attributeName) {
217         try {
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);
223         }
224     }
225
226     @Override
227     public Set<String> getAvailableModuleFactoryQNames() {
228         return configRegistryMXBeanProxy.getAvailableModuleFactoryQNames();
229     }
230
231     @Override
232     public ObjectName getServiceReference(final String serviceInterfaceQName, final String refName) throws InstanceNotFoundException {
233         return configRegistryMXBeanProxy.getServiceReference(serviceInterfaceQName, refName);
234     }
235
236     @Override
237     public void checkServiceReferenceExists(final ObjectName objectName) throws InstanceNotFoundException {
238         configRegistryMXBeanProxy.checkServiceReferenceExists(objectName);
239     }
240 }