/*
* Copyright 2015 Odnoklassniki Ltd, Mail.Ru Group
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package one.nio.mgt;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.management.Attribute;
import javax.management.AttributeList;
import javax.management.InstanceNotFoundException;
import javax.management.JMException;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.StandardMBean;
import java.lang.management.ManagementFactory;
import java.util.Collections;
import java.util.Set;
public class Management {
private static final Log log = LogFactory.getLog(Management.class);
static {
try {
// After registering this magic instance, new HotSpot internal MBeans appear:
// HotspotRuntimeMBean, getHotspotMemoryMBean etc.
Object hotspotInternal = Class.forName("sun.management.HotspotInternal").newInstance();
ManagementFactory.getPlatformMBeanServer().registerMBean(hotspotInternal, null);
} catch (Exception e) {
log.warn("Cannot register HotspotInternal: " + e);
}
}
public static void registerMXBean(Object object, String name) {
registerMXBean(object, null, name);
}
public static void registerMXBean(Object object, Class mxbeanInterface, String name) {
try {
StandardMBean mb = new StandardMBean(object, mxbeanInterface, true);
MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer();
ObjectName objectName = new ObjectName(name);
if (beanServer.isRegistered(objectName)) {
beanServer.unregisterMBean(objectName);
}
beanServer.registerMBean(mb, objectName);
} catch (Exception e) {
log.error("Cannot register MXBean " + name, e);
}
}
public static void unregisterMXBean(String name) {
try {
MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer();
ObjectName objectName = new ObjectName(name);
if (beanServer.isRegistered(objectName)) {
beanServer.unregisterMBean(objectName);
}
} catch (Exception e) {
log.error("Cannot unregister MXBean " + name, e);
}
}
public static Object getAttribute(String name, String attribute) throws JMException {
return getAttribute(new ObjectName(name), attribute);
}
public static Object getAttribute(ObjectName objName, String attribute) throws JMException {
return ManagementFactory.getPlatformMBeanServer().getAttribute(objName, attribute);
}
public static Object[] getAttributes(String name, String... attributes) throws JMException {
return getAttributes(new ObjectName(name), attributes);
}
public static Object[] getAttributes(ObjectName objName, String... attributes) throws JMException {
AttributeList list = ManagementFactory.getPlatformMBeanServer().getAttributes(objName, attributes);
Object[] values = new Object[list.size()];
for (int i = 0; i < values.length; i++) {
values[i] = ((Attribute) list.get(i)).getValue();
}
return values;
}
public static Set<ObjectName> resolvePattern(String name) throws JMException {
ObjectName objName = new ObjectName(name);
if (name.indexOf('*') < 0 && name.indexOf('?') < 0) {
return Collections.singleton(objName);
}
Set<ObjectName> objNames = ManagementFactory.getPlatformMBeanServer().queryNames(objName, null);
if (objNames.isEmpty()) {
throw new InstanceNotFoundException(name);
}
return objNames;
}
}