|
Java example source code file (ServerNotifForwarder.java)
The ServerNotifForwarder.java Java example source code/* * Copyright (c) 2002, 2013, 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 com.sun.jmx.remote.internal; import com.sun.jmx.remote.security.NotificationAccessController; import com.sun.jmx.remote.util.ClassLogger; import com.sun.jmx.remote.util.EnvHelp; import java.io.IOException; import java.security.AccessControlContext; import java.security.AccessController; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.management.InstanceNotFoundException; import javax.management.ListenerNotFoundException; import javax.management.MBeanPermission; import javax.management.MBeanServer; import javax.management.MBeanServerDelegate; import javax.management.MBeanServerNotification; import javax.management.Notification; import javax.management.NotificationBroadcaster; import javax.management.NotificationFilter; import javax.management.ObjectInstance; import javax.management.ObjectName; import javax.management.remote.NotificationResult; import javax.management.remote.TargetedNotification; import javax.management.MalformedObjectNameException; import javax.security.auth.Subject; public class ServerNotifForwarder { public ServerNotifForwarder(MBeanServer mbeanServer, Map<String, ?> env, NotificationBuffer notifBuffer, String connectionId) { this.mbeanServer = mbeanServer; this.notifBuffer = notifBuffer; this.connectionId = connectionId; connectionTimeout = EnvHelp.getServerConnectionTimeout(env); String stringBoolean = (String) env.get("jmx.remote.x.check.notification.emission"); checkNotificationEmission = EnvHelp.computeBooleanFromString( stringBoolean ); notificationAccessController = EnvHelp.getNotificationAccessController(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"); if (notificationAccessController != null) { notificationAccessController.addNotificationListener( connectionId, name, getSubject()); } try { boolean instanceOf = AccessController.doPrivileged( new PrivilegedExceptionAction<Boolean>() { public Boolean run() throws InstanceNotFoundException { return mbeanServer.isInstanceOf(name, broadcasterClass); } }); if (!instanceOf) { throw new IllegalArgumentException("The specified MBean [" + name + "] is not a " + "NotificationBroadcaster " + "object."); } } catch (PrivilegedActionException e) { throw (InstanceNotFoundException) extractException(e); } final Integer id = getListenerID(); // 6238731: set the default domain if no domain is set. ObjectName nn = name; if (name.getDomain() == null || name.getDomain().equals("")) { try { nn = ObjectName.getInstance(mbeanServer.getDefaultDomain(), name.getKeyPropertyList()); } catch (MalformedObjectNameException mfoe) { // impossible, but... IOException ioe = new IOException(mfoe.getMessage()); ioe.initCause(mfoe); throw ioe; } } synchronized (listenerMap) { IdAndFilter idaf = new IdAndFilter(id, filter); Set<IdAndFilter> set = listenerMap.get(nn); // Tread carefully because if set.size() == 1 it may be the // Collections.singleton we make here, which is unmodifiable. if (set == null) set = Collections.singleton(idaf); else { if (set.size() == 1) set = new HashSet<IdAndFilter>(set); set.add(idaf); } listenerMap.put(nn, set); } 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"); if (notificationAccessController != null) { notificationAccessController.removeNotificationListener( connectionId, name, getSubject()); } 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 (listenerMap) { // Tread carefully because if set.size() == 1 it may be a // Collections.singleton, which is unmodifiable. Set<IdAndFilter> set = listenerMap.get(name); IdAndFilter idaf = new IdAndFilter(listenerID, null); if (set == null || !set.contains(idaf)) throw new ListenerNotFoundException("Listener not found"); if (set.size() == 1) listenerMap.remove(name); else set.remove(idaf); } } /* This is the object that will apply our filtering to candidate * notifications. First of all, if there are no listeners for the * ObjectName that the notification is coming from, we go no further. * Then, for each listener, we must apply the corresponding filter (if any) * and ignore the listener if the filter rejects. Finally, we apply * some access checks which may also reject the listener. * * A given notification may trigger several listeners on the same MBean, * which is why listenerMap is a Map<ObjectName, Set Other Java examples (source code examples)Here is a short list of links related to this Java ServerNotifForwarder.java source code file: |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.