Bug 2187: Implement add-shard-replica RPC
[controller.git] / opendaylight / md-sal / sal-common-util / src / main / java / org / opendaylight / controller / md / sal / common / util / jmx / AbstractMXBean.java
1 /*
2  * Copyright (c) 2014 Brocade Communications 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
9 package org.opendaylight.controller.md.sal.common.util.jmx;
10
11 import com.google.common.annotations.Beta;
12 import java.lang.management.ManagementFactory;
13 import javax.annotation.Nonnull;
14 import javax.annotation.Nullable;
15 import javax.management.InstanceNotFoundException;
16 import javax.management.MBeanRegistrationException;
17 import javax.management.MBeanServer;
18 import javax.management.MalformedObjectNameException;
19 import javax.management.ObjectName;
20 import org.slf4j.Logger;
21 import org.slf4j.LoggerFactory;
22
23 /**
24  * Abstract base for an MXBean implementation class.
25  * <p>
26  * This class is not intended for use outside of MD-SAL and its part of private
27  * implementation (still exported as public to be reused across MD-SAL implementation
28  * components) and may be removed in subsequent
29  * releases.
30  *
31  * @author Thomas Pantelis
32  */
33 @Beta
34 public abstract class AbstractMXBean {
35
36     private static final Logger LOG = LoggerFactory.getLogger(AbstractMXBean.class);
37
38     public static String BASE_JMX_PREFIX = "org.opendaylight.controller:";
39
40     private final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
41
42     private final String mBeanName;
43     private final String mBeanType;
44     private final String mBeanCategory;
45
46     /**
47      * Constructor.
48      *
49      * @param mBeanName Used as the <code>name</code> property in the bean's ObjectName.
50      * @param mBeanType Used as the <code>type</code> property in the bean's ObjectName.
51      * @param mBeanCategory Used as the <code>Category</code> property in the bean's ObjectName.
52      */
53     protected AbstractMXBean(@Nonnull String mBeanName, @Nonnull String mBeanType,
54             @Nullable String mBeanCategory) {
55         this.mBeanName = mBeanName;
56         this.mBeanType = mBeanType;
57         this.mBeanCategory = mBeanCategory;
58     }
59
60     private ObjectName getMBeanObjectName() throws MalformedObjectNameException {
61         StringBuilder builder = new StringBuilder(BASE_JMX_PREFIX)
62                 .append("type=").append(getMBeanType());
63
64         if(getMBeanCategory() != null) {
65             builder.append(",Category=").append(getMBeanCategory());
66         }
67
68         builder.append(",name=").append(getMBeanName());
69         return new ObjectName(builder.toString());
70     }
71
72     /**
73      * Registers this bean with the platform MBean server with the domain defined by
74      * {@link #BASE_JMX_PREFIX}.
75      *
76      * @return true is successfully registered, false otherwise.
77      */
78     public boolean registerMBean() {
79         boolean registered = false;
80         try {
81             // Object to identify MBean
82             final ObjectName mbeanName = this.getMBeanObjectName();
83
84             LOG.debug("Register MBean {}", mbeanName);
85
86             // unregistered if already registered
87             if(server.isRegistered(mbeanName)) {
88
89                 LOG.debug("MBean {} found to be already registered", mbeanName);
90
91                 try {
92                     unregisterMBean(mbeanName);
93                 } catch(Exception e) {
94
95                     LOG.warn("unregister mbean {} resulted in exception {} ", mbeanName, e);
96                 }
97             }
98             server.registerMBean(this, mbeanName);
99             registered = true;
100
101             LOG.debug("MBean {} registered successfully", mbeanName.getCanonicalName());
102         } catch(Exception e) {
103
104             LOG.error("registration failed {}", e);
105
106         }
107         return registered;
108     }
109
110     /**
111      * Unregisters this bean with the platform MBean server.
112      *
113      * @return true is successfully unregistered, false otherwise.
114      */
115     public boolean unregisterMBean() {
116         boolean unregister = false;
117         try {
118             ObjectName mbeanName = this.getMBeanObjectName();
119             unregisterMBean(mbeanName);
120             unregister = true;
121         } catch(Exception e) {
122             LOG.debug("Failed when unregistering MBean {}", e);
123         }
124
125         return unregister;
126     }
127
128     private void unregisterMBean(ObjectName mbeanName) throws MBeanRegistrationException,
129             InstanceNotFoundException {
130         server.unregisterMBean(mbeanName);
131     }
132
133     /**
134      * Returns the <code>name</code> property of the bean's ObjectName.
135      */
136     public String getMBeanName() {
137         return mBeanName;
138     }
139
140     /**
141      * Returns the <code>type</code> property of the bean's ObjectName.
142      */
143     public String getMBeanType() {
144         return mBeanType;
145     }
146
147     /**
148      * Returns the <code>Category</code> property of the bean's ObjectName.
149      */
150     public String getMBeanCategory() {
151         return mBeanCategory;
152     }
153 }