servernotifforwarder.java

来自「JAVA的一些源码 JAVA2 STANDARD EDITION DEVELO」· Java 代码 · 共 288 行

JAVA
288
字号
/* * @(#)ServerNotifForwarder.java	1.45 03/12/19 *  * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package com.sun.jmx.remote.internal;import java.io.IOException;import java.security.AccessControlContext;import java.security.AccessController;import java.security.PrivilegedAction;import java.security.PrivilegedActionException;import java.security.PrivilegedExceptionAction;import java.util.Set;import java.util.HashSet;import java.util.Map;import javax.management.ObjectInstance;import javax.management.ObjectName;import javax.management.MBeanPermission;import javax.management.MBeanServer;import javax.management.Notification;import javax.management.NotificationBroadcaster;import javax.management.NotificationListener;import javax.management.NotificationFilter;import javax.management.MBeanServerNotification;import javax.management.NotificationFilterSupport;import javax.management.ListenerNotFoundException;import javax.management.InstanceNotFoundException;import javax.management.remote.TargetedNotification;import javax.management.remote.NotificationResult;import javax.security.auth.Subject;import com.sun.jmx.remote.util.ClassLogger;import com.sun.jmx.remote.util.EnvHelp;import com.sun.jmx.remote.internal.ListenerInfo;public class ServerNotifForwarder {    public ServerNotifForwarder(MBeanServer mbeanServer, 				Map env, 				NotificationBuffer notifBuffer) {	this.mbeanServer = mbeanServer;	this.notifBuffer = notifBuffer;	connectionTimeout = EnvHelp.getServerConnectionTimeout(env);    }    public Integer addNotificationListener(final ObjectName name,                                           final NotificationFilter filter)        throws InstanceNotFoundException, IOException {                 if (logger.traceOn()) {            logger.trace("addNotificationListener",                         "Add a listener at " + name);        }        checkState();        // Explicitly check MBeanPermission for addNotificationListener        //        checkMBeanPermission(name, "addNotificationListener");	try {	    Boolean instanceOf = (Boolean)		AccessController.doPrivileged(new PrivilegedExceptionAction() {			public Object run() throws InstanceNotFoundException {			    return new Boolean(					       mbeanServer.isInstanceOf(name,									broadcasterClass));			}                    });	    if (!instanceOf.booleanValue()) {		throw new IllegalArgumentException("The specified MBean [" +						   name + "] is not a " +						   "NotificationBroadcaster " +						   "object.");	    }	} catch (PrivilegedActionException e) {	    throw (InstanceNotFoundException) extractException(e);	}        final Integer id = getListenerID();        synchronized(listenerList) {            listenerList.add(new ListenerInfo(id, name, filter));        }        return id;    }    public void removeNotificationListener(ObjectName name,                                           Integer[] listenerIDs)        throws Exception {        if (logger.traceOn()) {            logger.trace("removeNotificationListener",                         "Remove some listeners from " + name);        }        checkState();        // Explicitly check MBeanPermission for removeNotificationListener        //        checkMBeanPermission(name, "removeNotificationListener");        Exception re = null;        for (int i = 0 ; i < listenerIDs.length ; i++) {            try {                removeNotificationListener(name, listenerIDs[i]);            } catch (Exception e) {                // Give back the first exception                //                if (re != null) {                    re = e;                }            }        }        if (re != null) {            throw re;        }    }    public void removeNotificationListener(ObjectName name, Integer listenerID)        throws        InstanceNotFoundException,        ListenerNotFoundException,        IOException {        if (logger.traceOn()) {            logger.trace("removeNotificationListener",                         "Remove the listener " + listenerID + " from " + name);        }        checkState();	if (name != null && !name.isPattern()) {	    if (!mbeanServer.isRegistered(name)) {		throw new InstanceNotFoundException("The MBean " + name +						    " is not registered.");	    }	}        synchronized(listenerList) {            if (!listenerList.remove(new ListenerInfo(listenerID,name,null))) {                throw new ListenerNotFoundException("Listener not found!");            }        }    }    public NotificationResult fetchNotifs(long startSequenceNumber,                                          long timeout,                                          int maxNotifications) {        if (logger.traceOn()) {            logger.trace("fetchNotifs", "Fetching notifications, the " +                         "startSequenceNumber is " + startSequenceNumber +                         ", the timeout is " + timeout +                         ", the maxNotifications is " + maxNotifications);        }        NotificationResult nr = null;	final long t = Math.min(connectionTimeout, timeout);        try {            nr = notifBuffer.fetchNotifications(listenerList,                                                startSequenceNumber,                                                t, maxNotifications);        } catch (InterruptedException ire) {            nr = new NotificationResult(0L, 0L, new TargetedNotification[0]);        }        if (logger.traceOn()) {            logger.trace("fetchNotifs", "Forwarding the notifs: "+nr);        }        return nr;    }    public void terminate() {        if (logger.traceOn()) {            logger.trace("terminate", "Be called.");        }        synchronized(terminationLock) {            if (terminated) {                return;            }            terminated = true;            synchronized(listenerList) {                listenerList.clear();            }        }        if (logger.traceOn()) {            logger.trace("terminate", "Terminated.");        }    }    //----------------    // PRIVATE METHODS    //----------------    private void checkState() throws IOException {        synchronized(terminationLock) {            if (terminated) {                throw new IOException("The connection has been terminated.");            }        }    }    private Integer getListenerID() {        synchronized(listenerCounterLock) {            return new Integer(listenerCounter++);        }    }    /**     * Explicitly check the MBeanPermission for     * the current access control context.     */    private void checkMBeanPermission(final ObjectName name,                                      final String actions)        throws InstanceNotFoundException, SecurityException {        SecurityManager sm = System.getSecurityManager();        if (sm != null) {            AccessControlContext acc = AccessController.getContext();            ObjectInstance oi = null;            try {                oi = (ObjectInstance) AccessController.doPrivileged(                    new PrivilegedExceptionAction() {                            public Object run()                                throws InstanceNotFoundException {                                return mbeanServer.getObjectInstance(name);                            }                        });            } catch (PrivilegedActionException e) {                throw (InstanceNotFoundException) extractException(e);            }            String classname = oi.getClassName();            MBeanPermission perm = new MBeanPermission(classname,                                                       null,                                                       name,                                                       actions);            sm.checkPermission(perm, acc);        }    }    /**     * Iterate until we extract the real exception     * from a stack of PrivilegedActionExceptions.     */    private static Exception extractException(Exception e) {        while (e instanceof PrivilegedActionException) {            e = ((PrivilegedActionException)e).getException();         }        return e;    }    //------------------    // PRIVATE VARIABLES    //------------------    private MBeanServer mbeanServer;    private final long connectionTimeout;    private static int listenerCounter = 0;    private final static int[] listenerCounterLock = new int[0];    private NotificationBuffer notifBuffer;    private Set listenerList = new HashSet();    private boolean terminated = false;    private final int[] terminationLock = new int[0];    static final String broadcasterClass =        NotificationBroadcaster.class.getName();    private static final ClassLogger logger =        new ClassLogger("javax.management.remote.misc", "ServerNotifForwarder");}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?