8007471: Improve MBean notifications
Summary: Improve MBean notifications
Reviewed-by: dfuchs, mchung, alanb, skoivu
--- a/jdk/src/share/classes/com/sun/jmx/remote/internal/ArrayNotificationBuffer.java Fri Mar 29 22:07:56 2013 +0400
+++ b/jdk/src/share/classes/com/sun/jmx/remote/internal/ArrayNotificationBuffer.java Sun Mar 31 22:00:37 2013 +0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -397,6 +397,20 @@
if (nextSeq < nextSequenceNumber()) {
candidate = notificationAt(nextSeq);
+ // Skip security check if NotificationBufferFilter is not overloaded
+ if (!(filter instanceof ServerNotifForwarder.NotifForwarderBufferFilter)) {
+ try {
+ ServerNotifForwarder.checkMBeanPermission(this.mBeanServer,
+ candidate.getObjectName(),"addNotificationListener");
+ } catch (InstanceNotFoundException | SecurityException e) {
+ if (logger.debugOn()) {
+ logger.debug("fetchNotifications", "candidate: " + candidate + " skipped. exception " + e);
+ }
+ ++nextSeq;
+ continue;
+ }
+ }
+
if (logger.debugOn()) {
logger.debug("fetchNotifications", "candidate: " +
candidate);
--- a/jdk/src/share/classes/com/sun/jmx/remote/internal/ServerNotifForwarder.java Fri Mar 29 22:07:56 2013 +0400
+++ b/jdk/src/share/classes/com/sun/jmx/remote/internal/ServerNotifForwarder.java Sun Mar 31 22:00:37 2013 +0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -226,8 +226,9 @@
* why we add the found notifications to a supplied List rather than
* just returning a boolean.
*/
- private final NotificationBufferFilter bufferFilter =
- new NotificationBufferFilter() {
+ private final NotifForwarderBufferFilter bufferFilter = new NotifForwarderBufferFilter();
+
+ final class NotifForwarderBufferFilter implements NotificationBufferFilter {
public void apply(List<TargetedNotification> targetedNotifs,
ObjectName source, Notification notif) {
// We proceed in two stages here, to avoid holding the listenerMap
@@ -366,9 +367,16 @@
* Explicitly check the MBeanPermission for
* the current access control context.
*/
- public void checkMBeanPermission(
+ public final void checkMBeanPermission(
final ObjectName name, final String actions)
throws InstanceNotFoundException, SecurityException {
+ checkMBeanPermission(mbeanServer,name,actions);
+ }
+
+ static void checkMBeanPermission(
+ final MBeanServer mbs, final ObjectName name, final String actions)
+ throws InstanceNotFoundException, SecurityException {
+
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
AccessControlContext acc = AccessController.getContext();
@@ -378,7 +386,7 @@
new PrivilegedExceptionAction<ObjectInstance>() {
public ObjectInstance run()
throws InstanceNotFoundException {
- return mbeanServer.getObjectInstance(name);
+ return mbs.getObjectInstance(name);
}
});
} catch (PrivilegedActionException e) {