235 lines
7.7 KiB
Java
235 lines
7.7 KiB
Java
/*
|
|
* Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* This code is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License version 2 only, as
|
|
* published by the Free Software Foundation. Oracle designates this
|
|
* particular file as subject to the "Classpath" exception as provided
|
|
* by Oracle in the LICENSE file that accompanied this code.
|
|
*
|
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
* version 2 for more details (a copy is included in the LICENSE file that
|
|
* accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU General Public License version
|
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
* or visit www.oracle.com if you need additional information or have any
|
|
* questions.
|
|
*/
|
|
|
|
package javax.management;
|
|
|
|
import com.sun.jmx.defaults.JmxProperties;
|
|
import com.sun.jmx.defaults.ServiceName;
|
|
import com.sun.jmx.mbeanserver.Util;
|
|
|
|
/**
|
|
* Represents the MBean server from the management point of view.
|
|
* The MBeanServerDelegate MBean emits the MBeanServerNotifications when
|
|
* an MBean is registered/unregistered in the MBean server.
|
|
*
|
|
* @since 1.5
|
|
*/
|
|
public class MBeanServerDelegate implements MBeanServerDelegateMBean,
|
|
NotificationEmitter {
|
|
|
|
/** The MBean server agent identification.*/
|
|
private String mbeanServerId ;
|
|
|
|
/** The NotificationBroadcasterSupport object that sends the
|
|
notifications */
|
|
private final NotificationBroadcasterSupport broadcaster;
|
|
|
|
private static long oldStamp = 0;
|
|
private final long stamp;
|
|
private long sequenceNumber = 1;
|
|
|
|
private static final MBeanNotificationInfo[] notifsInfo;
|
|
|
|
static {
|
|
final String[] types = {
|
|
MBeanServerNotification.UNREGISTRATION_NOTIFICATION,
|
|
MBeanServerNotification.REGISTRATION_NOTIFICATION
|
|
};
|
|
notifsInfo = new MBeanNotificationInfo[1];
|
|
notifsInfo[0] =
|
|
new MBeanNotificationInfo(types,
|
|
"javax.management.MBeanServerNotification",
|
|
"Notifications sent by the MBeanServerDelegate MBean");
|
|
}
|
|
|
|
/**
|
|
* Create a MBeanServerDelegate object.
|
|
*/
|
|
public MBeanServerDelegate () {
|
|
stamp = getStamp();
|
|
broadcaster = new NotificationBroadcasterSupport() ;
|
|
}
|
|
|
|
|
|
/**
|
|
* Returns the MBean server agent identity.
|
|
*
|
|
* @return the identity.
|
|
*/
|
|
public synchronized String getMBeanServerId() {
|
|
if (mbeanServerId == null) {
|
|
String localHost;
|
|
try {
|
|
localHost = java.net.InetAddress.getLocalHost().getHostName();
|
|
} catch (java.net.UnknownHostException e) {
|
|
JmxProperties.MISC_LOGGER.finest("Can't get local host name, " +
|
|
"using \"localhost\" instead. Cause is: "+e);
|
|
localHost = "localhost";
|
|
}
|
|
mbeanServerId = localHost + "_" + stamp;
|
|
}
|
|
return mbeanServerId;
|
|
}
|
|
|
|
/**
|
|
* Returns the full name of the JMX specification implemented
|
|
* by this product.
|
|
*
|
|
* @return the specification name.
|
|
*/
|
|
public String getSpecificationName() {
|
|
return ServiceName.JMX_SPEC_NAME;
|
|
}
|
|
|
|
/**
|
|
* Returns the version of the JMX specification implemented
|
|
* by this product.
|
|
*
|
|
* @return the specification version.
|
|
*/
|
|
public String getSpecificationVersion() {
|
|
return ServiceName.JMX_SPEC_VERSION;
|
|
}
|
|
|
|
/**
|
|
* Returns the vendor of the JMX specification implemented
|
|
* by this product.
|
|
*
|
|
* @return the specification vendor.
|
|
*/
|
|
public String getSpecificationVendor() {
|
|
return ServiceName.JMX_SPEC_VENDOR;
|
|
}
|
|
|
|
/**
|
|
* Returns the JMX implementation name (the name of this product).
|
|
*
|
|
* @return the implementation name.
|
|
*/
|
|
public String getImplementationName() {
|
|
return ServiceName.JMX_IMPL_NAME;
|
|
}
|
|
|
|
/**
|
|
* Returns the JMX implementation version (the version of this product).
|
|
*
|
|
* @return the implementation version.
|
|
*/
|
|
public String getImplementationVersion() {
|
|
try {
|
|
return System.getProperty("java.runtime.version");
|
|
} catch (SecurityException e) {
|
|
return "";
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Returns the JMX implementation vendor (the vendor of this product).
|
|
*
|
|
* @return the implementation vendor.
|
|
*/
|
|
public String getImplementationVendor() {
|
|
return ServiceName.JMX_IMPL_VENDOR;
|
|
}
|
|
|
|
// From NotificationEmitter extends NotificationBroacaster
|
|
//
|
|
public MBeanNotificationInfo[] getNotificationInfo() {
|
|
final int len = MBeanServerDelegate.notifsInfo.length;
|
|
final MBeanNotificationInfo[] infos =
|
|
new MBeanNotificationInfo[len];
|
|
System.arraycopy(MBeanServerDelegate.notifsInfo,0,infos,0,len);
|
|
return infos;
|
|
}
|
|
|
|
// From NotificationEmitter extends NotificationBroacaster
|
|
//
|
|
public synchronized
|
|
void addNotificationListener(NotificationListener listener,
|
|
NotificationFilter filter,
|
|
Object handback)
|
|
throws IllegalArgumentException {
|
|
broadcaster.addNotificationListener(listener,filter,handback) ;
|
|
}
|
|
|
|
// From NotificationEmitter extends NotificationBroacaster
|
|
//
|
|
public synchronized
|
|
void removeNotificationListener(NotificationListener listener,
|
|
NotificationFilter filter,
|
|
Object handback)
|
|
throws ListenerNotFoundException {
|
|
broadcaster.removeNotificationListener(listener,filter,handback) ;
|
|
}
|
|
|
|
// From NotificationEmitter extends NotificationBroacaster
|
|
//
|
|
public synchronized
|
|
void removeNotificationListener(NotificationListener listener)
|
|
throws ListenerNotFoundException {
|
|
broadcaster.removeNotificationListener(listener) ;
|
|
}
|
|
|
|
/**
|
|
* Enables the MBean server to send a notification.
|
|
* If the passed <var>notification</var> has a sequence number lesser
|
|
* or equal to 0, then replace it with the delegate's own sequence
|
|
* number.
|
|
* @param notification The notification to send.
|
|
*
|
|
*/
|
|
public void sendNotification(Notification notification) {
|
|
if (notification.getSequenceNumber() < 1) {
|
|
synchronized (this) {
|
|
notification.setSequenceNumber(this.sequenceNumber++);
|
|
}
|
|
}
|
|
broadcaster.sendNotification(notification);
|
|
}
|
|
|
|
/**
|
|
* Defines the default ObjectName of the MBeanServerDelegate.
|
|
*
|
|
* @since 1.6
|
|
*/
|
|
public static final ObjectName DELEGATE_NAME =
|
|
Util.newObjectName("JMImplementation:type=MBeanServerDelegate");
|
|
|
|
/* Return a timestamp that is monotonically increasing even if
|
|
System.currentTimeMillis() isn't (for example, if you call this
|
|
constructor more than once in the same millisecond, or if the
|
|
clock always returns the same value). This means that the ids
|
|
for a given JVM will always be distinact, though there is no
|
|
such guarantee for two different JVMs. */
|
|
private static synchronized long getStamp() {
|
|
long s = System.currentTimeMillis();
|
|
if (oldStamp >= s) {
|
|
s = oldStamp + 1;
|
|
}
|
|
oldStamp = s;
|
|
return s;
|
|
}
|
|
}
|