This adds the delegate management bean for the management
servers.

Changelog:

2006-10-02  Andrew John Hughes  <[EMAIL PROTECTED]>

        * gnu/classpath/ListenerData.java:
        New class for holding listener data.
        * gnu/java/lang/management/MemoryMXBeanImpl.java:
        ListenerData class moved to its own file.
        * javax/management/MBeanServerDelegate.java,
        * javax/management/MBeanServerDelegateMBean.java,
        * javax/management/MBeanServerNotification.java:
        Implemented.

-- 
Andrew :-)

Escape the Java Trap with GNU Classpath!
http://www.gnu.org/philosophy/java-trap.html
public class gcj extends Freedom implements Java { ... }
Index: gnu/classpath/ListenerData.java
===================================================================
RCS file: gnu/classpath/ListenerData.java
diff -N gnu/classpath/ListenerData.java
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ gnu/classpath/ListenerData.java     2 Oct 2006 18:22:48 -0000
@@ -0,0 +1,136 @@
+/* ListenerData.java - Class to contain data about management bean listeners
+   Copyright (C) 2006 Free Software Foundation
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath 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 for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING.  If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.classpath;
+
+import javax.management.NotificationFilter;
+import javax.management.NotificationListener;
+
+/**
+ * Container for data on management listeners.  Wraps
+ * a [EMAIL PROTECTED] javax.management.NotificationListener},
+ * [EMAIL PROTECTED] javax.management.NotificationFilter} and
+ * passback object in one class.
+ *
+ * @author Andrew John Hughes ([EMAIL PROTECTED])
+ * @since 1.5
+ */
+public class ListenerData
+{
+  /**
+   * The listener itself.
+   */
+  private NotificationListener listener;
+
+  /**
+   * A filter to apply to incoming events.
+   */
+  private NotificationFilter filter;
+
+  /**
+   * An object to pass back to the listener on an
+   * event occurring.
+   */
+  private Object passback;
+  
+  /**
+   * Constructs a new [EMAIL PROTECTED] ListenerData} with the specified
+   * listener, filter and passback object.
+   *
+   * @param listener the listener itself.
+   * @param filter the filter for incoming events.
+   * @param passback the object to passback on an incoming event.
+   */
+  public ListenerData(NotificationListener listener,
+                     NotificationFilter filter, Object passback)
+  {
+    this.listener = listener;
+    this.filter = filter;
+    this.passback = passback;
+  }
+  
+  /**
+   * Returns the listener.
+   *
+   * @return the listener.
+   */
+  public NotificationListener getListener()
+  {
+    return listener;
+  }
+  
+  /**
+   * Returns the filter.
+   *
+   * @return the filter.
+   */
+  public NotificationFilter getFilter()
+  {
+    return filter;
+  }
+  
+  /**
+   * Returns the passback object.
+   *
+   * @return the passback object.
+   */
+  public Object getPassback()
+  {
+    return passback;
+  }
+  
+  /**
+   * Returns true if the supplied object is an instance of
+   * [EMAIL PROTECTED] ListenerData} and has the same listener, filter
+   * and passback object.
+   *
+   * @param obj the object to check.
+   * @return true if <code>obj</code> is equal to this.
+   */
+  public boolean equals(Object obj)
+  {
+    if (obj instanceof ListenerData)
+      {
+       ListenerData data = (ListenerData) obj;
+       return (data.getListener() == listener &&
+               data.getFilter() == filter &&
+               data.getPassback() == passback);
+      }
+    return false;
+  }
+  
+}
Index: gnu/java/lang/management/MemoryMXBeanImpl.java
===================================================================
RCS file: 
/cvsroot/classpath/classpath/gnu/java/lang/management/MemoryMXBeanImpl.java,v
retrieving revision 1.5
diff -u -3 -p -u -r1.5 MemoryMXBeanImpl.java
--- gnu/java/lang/management/MemoryMXBeanImpl.java      29 Jul 2006 14:05:59 
-0000      1.5
+++ gnu/java/lang/management/MemoryMXBeanImpl.java      2 Oct 2006 18:22:48 
-0000
@@ -37,6 +37,8 @@ exception statement from your version. *
 
 package gnu.java.lang.management;
 
+import gnu.classpath.ListenerData;
+
 import java.lang.management.MemoryMXBean;
 import java.lang.management.MemoryNotificationInfo;
 import java.lang.management.MemoryUsage;
@@ -168,49 +170,6 @@ public final class MemoryMXBeanImpl
     VMMemoryMXBeanImpl.setVerbose(verbose);
   }
 
-  private class ListenerData
-  {
-    private NotificationListener listener;
-    private NotificationFilter filter;
-    private Object passback;
-
-    public ListenerData(NotificationListener listener,
-                       NotificationFilter filter, Object passback)
-    {
-      this.listener = listener;
-      this.filter = filter;
-      this.passback = passback;
-    }
-    
-    public NotificationListener getListener()
-    {
-      return listener;
-    }
-
-    public NotificationFilter getFilter()
-    {
-      return filter;
-    }
-
-    public Object getPassback()
-    {
-      return passback;
-    }
-
-    public boolean equals(Object obj)
-    {
-      if (obj instanceof ListenerData)
-       {
-         ListenerData data = (ListenerData) obj;
-         return (data.getListener() == listener &&
-                 data.getFilter() == filter &&
-                 data.getPassback() == passback);
-       }
-      return false;
-    }
-
-  }
-
   public void addNotificationListener(NotificationListener listener,
                                      NotificationFilter filter,
                                      Object passback)
Index: javax/management/MBeanServerDelegate.java
===================================================================
RCS file: javax/management/MBeanServerDelegate.java
diff -N javax/management/MBeanServerDelegate.java
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ javax/management/MBeanServerDelegate.java   2 Oct 2006 18:22:57 -0000
@@ -0,0 +1,308 @@
+/* MBeanServerDelegate.java -- The management server delegate.
+   Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath 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 for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING.  If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version. */
+
+package javax.management;
+
+import gnu.classpath.ListenerData;
+import gnu.classpath.SystemProperties;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Provides an implementation of a delegate bean, which is associated
+ * with a management server.  The delegate bean is responsible
+ * for providing metadata about the server and handling the
+ * registration and deregistration notifications.
+ *
+ * @author Andrew John Hughes ([EMAIL PROTECTED])
+ * @since 1.5
+ */
+public class MBeanServerDelegate
+  implements MBeanServerDelegateMBean, NotificationEmitter
+{
+
+  /**
+   * The identifier of the server associated with this delegate.
+   */
+  private String id;
+
+  /**
+   * The listeners registered with the delegate.
+   */
+  private List listeners;
+
+  /**
+   * The sequence identifier used by the delegate.
+   */
+  private long seqNo;
+
+  /**
+   * Default constructor which generates the id.
+   */
+  public MBeanServerDelegate()
+  {
+    String hostName;
+    try
+      {
+        hostName = InetAddress.getLocalHost().getHostName();
+      }
+    catch (UnknownHostException e)
+      {
+        hostName = "Unknown host";
+      }
+    id = hostName + "_" + new Date().getTime();
+  }
+
+  /**
+   * Registers the specified listener as a new recipient of
+   * notifications from the delegate.  If non-null, the filter
+   * argument will be used to select which notifications are
+   * delivered.  The supplied object will also be passed to
+   * the recipient with each notification.  This should not
+   * be modified by the broadcaster, but instead should be
+   * passed unmodified to the listener.
+   *
+   * @param listener the new listener, who will receive
+   *                 notifications from this broadcasting bean.
+   * @param filter a filter to determine which notifications are
+   *               delivered to the listener, or <code>null</code>
+   *               if no filtering is required.
+   * @param passback an object to be passed to the listener with
+   *                 each notification.
+   * @throws IllegalArgumentException if <code>listener</code> is
+   *                                  <code>null</code>.
+   * @see #removeNotificationListener(NotificationListener)
+   */
+  public void addNotificationListener(NotificationListener listener,
+                                     NotificationFilter filter,
+                                     Object passback)
+    throws IllegalArgumentException
+  {
+    if (listener == null)
+      throw new IllegalArgumentException("A null listener was supplied.");
+    if (listeners == null)
+      listeners = new ArrayList();
+    listeners.add(new ListenerData(listener, filter, passback));
+  }
+
+  /**
+   * Returns the name of this Java Management eXtensions (JMX) implementation.
+   *
+   * @return the implementation name.
+   */
+  public String getImplementationName()
+  {
+    return "GNU JMX";
+  }
+
+  /**
+   * Returns the vendor of this Java Management eXtensions (JMX) 
implementation.
+   *
+   * @return the implementation vendor.
+   */
+  public String getImplementationVendor()
+  {
+    return "The GNU Classpath Project";
+  }
+
+  /**
+   * Returns the version of this Java Management eXtensions (JMX) 
implementation.
+   *
+   * @return the implementation version.
+   */
+  public String getImplementationVersion()
+  {
+    return SystemProperties.getProperty("gnu.classpath.version");
+  }
+
+  /**
+   * Returns the unique identifier for this management server.
+   *
+   * @return the unique id of the server.
+   */
+  public String getMBeanServerId()
+  {
+    return id;
+  }
+
+  /**
+   * Returns an array describing the notifications this
+   * bean may send to its registered listeners.  Ideally, this
+   * array should be complete, but in some cases, this may
+   * not be possible.  However, be aware that some listeners
+   * may expect this to be so.
+   *
+   * @return the array of possible notifications.
+   */
+  public MBeanNotificationInfo[] getNotificationInfo()
+  {
+    return new MBeanNotificationInfo[] 
+      {
+       new MBeanNotificationInfo(new String[]
+         {
+           MBeanServerNotification.REGISTRATION_NOTIFICATION,
+           MBeanServerNotification.UNREGISTRATION_NOTIFICATION,
+         },
+                                 MBeanServerNotification.class.getName(),
+                                 "Server registration notifications")
+      };
+  }
+
+  /**
+   * Returns the name of this Java Management eXtensions (JMX) specification.
+   *
+   * @return the specification name.
+   */
+  public String getSpecificationName()
+  {
+    return "JMX";
+  }
+
+
+  /**
+   * Returns the vendor of this Java Management eXtensions (JMX) specification.
+   *
+   * @return the specification vendor.
+   */
+  public String getSpecificationVendor()
+  {
+    return "Sun Microsystems";
+  }
+
+  /**
+   * Returns the version of this Java Management eXtensions (JMX) 
specification.
+   *
+   * @return the specification version.
+   */
+  public String getSpecificationVersion()
+  {
+    return "1.2";
+  }
+
+  /**
+   * Removes the specified listener from the list of recipients
+   * of notifications from this bean.  This includes all combinations
+   * of filters and passback objects registered for this listener.
+   * For more specific removal of listeners, see
+   * [EMAIL PROTECTED] #removeNotificationListener(NotificationListener,
+   * NotificationFilter, java.lang.Object)}
+   *
+   * @param listener the listener to remove.
+   * @throws ListenerNotFoundException if the specified listener
+   *                                   is not registered with this bean.
+   * @see #addNotificationListener(NotificationListener, NotificationFilter,
+   *                               java.lang.Object)
+   */
+  public void removeNotificationListener(NotificationListener listener)
+    throws ListenerNotFoundException
+  {
+    Iterator it = listeners.iterator();
+    boolean foundOne = false;
+    while (it.hasNext())
+      {
+       ListenerData data = (ListenerData) it.next();
+       if (data.getListener() == listener)
+         {
+           it.remove();
+           foundOne = true;
+         }
+      }
+    if (!foundOne)
+      throw new ListenerNotFoundException("The specified listener, " + 
listener +
+                                         "is not registered with this bean.");
+  }
+
+  /**
+   * Removes the specified listener from the list of recipients
+   * of notifications from this delegate.  Only the first instance with
+   * the supplied filter and passback object is removed.
+   * <code>null</code> is used as a valid value for these parameters,
+   * rather than as a way to remove all registration instances for
+   * the specified listener; for this behaviour instead, see
+   * [EMAIL PROTECTED] #removeNotificationListener(NotificationListener)}.
+   *
+   * @param listener the listener to remove.
+   * @param filter the filter of the listener to remove.
+   * @param passback the passback object of the listener to remove.
+   * @throws ListenerNotFoundException if the specified listener
+   *                                   is not registered with this bean.
+   * @see #addNotificationListener(NotificationListener, NotificationFilter,
+   *                               java.lang.Object)
+   * @see #removeNotificationListener(NotificationListener)
+   */
+  public void removeNotificationListener(NotificationListener listener,
+                                        NotificationFilter filter,
+                                        Object passback)
+    throws ListenerNotFoundException
+  {
+    if (!(listeners.remove(new ListenerData(listener, filter, passback))))
+      {
+       throw new ListenerNotFoundException("The specified listener, " + 
listener +
+                                           " with filter " + filter + 
+                                           "and passback " + passback + 
+                                           ", is not registered with this 
bean.");
+      }
+  }
+
+  /**
+   * Allows the server to use the delegate to send a notification.
+   * If the supplied notification has a sequence number <= 0, then
+   * it is replaced with the delegate's own sequence number.
+   *
+   * @param notification the notification to send.
+   */
+  public void sendNotification(Notification notification)
+  {
+    if (notification.getSequenceNumber() <= 0)
+      notification.setSequenceNumber(++seqNo);
+    Iterator it = listeners.iterator();
+    while (it.hasNext())
+      {
+       ListenerData ldata = (ListenerData) it.next();
+       NotificationFilter filter = ldata.getFilter();
+       if (filter == null || filter.isNotificationEnabled(notification))
+         ldata.getListener().handleNotification(notification, 
ldata.getPassback());
+      }
+  }
+
+}
Index: javax/management/MBeanServerDelegateMBean.java
===================================================================
RCS file: javax/management/MBeanServerDelegateMBean.java
diff -N javax/management/MBeanServerDelegateMBean.java
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ javax/management/MBeanServerDelegateMBean.java      2 Oct 2006 18:22:57 
-0000
@@ -0,0 +1,101 @@
+/* MBeanServerDelegateMBean.java -- The interface of a management server 
delegate.
+   Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath 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 for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING.  If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version. */
+
+package javax.management;
+
+/**
+ * Defines the interface for the delegate bean associated
+ * with a management server.  The delegate bean is responsible
+ * for providing metadata about the server and handling the
+ * registration and deregistration notifications.
+ *
+ * @author Andrew John Hughes ([EMAIL PROTECTED])
+ * @since 1.5
+ */
+public interface MBeanServerDelegateMBean
+{
+
+  /**
+   * Returns the name of this Java Management eXtensions (JMX) implementation.
+   *
+   * @return the implementation name.
+   */
+  String getImplementationName();
+
+  /**
+   * Returns the vendor of this Java Management eXtensions (JMX) 
implementation.
+   *
+   * @return the implementation vendor.
+   */
+  String getImplementationVendor();
+
+  /**
+   * Returns the version of this Java Management eXtensions (JMX) 
implementation.
+   *
+   * @return the implementation version.
+   */
+  String getImplementationVersion();
+
+  /**
+   * Returns the unique identifier for this management server.
+   *
+   * @return the unique id of the server.
+   */
+  String getMBeanServerId();
+
+  /**
+   * Returns the name of this Java Management eXtensions (JMX) specification.
+   *
+   * @return the specification name.
+   */
+  String getSpecificationName();
+
+  /**
+   * Returns the vendor of this Java Management eXtensions (JMX) specification.
+   *
+   * @return the specification vendor.
+   */
+  String getSpecificationVendor();
+
+  /**
+   * Returns the version of this Java Management eXtensions (JMX) 
specification.
+   *
+   * @return the specification version.
+   */
+  String getSpecificationVersion();
+
+}
Index: javax/management/MBeanServerNotification.java
===================================================================
RCS file: javax/management/MBeanServerNotification.java
diff -N javax/management/MBeanServerNotification.java
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ javax/management/MBeanServerNotification.java       2 Oct 2006 18:22:57 
-0000
@@ -0,0 +1,103 @@
+/* MBeanServerNotification.java -- The registration notification.
+   Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath 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 for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING.  If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version. */
+
+package javax.management;
+
+/**
+ * The notification emitted by a management server on a registration
+ * or de-registration event.  Events are emitted via the delegate
+ * management bean of the server.  Other objects can listen for
+ * such events by registering their interest with the delegate
+ * bean.  The bean can be obtained via the [EMAIL PROTECTED] ObjectName}
+ * <code>JMImplementation:type=MBeanServerDelegate</code>.
+ *
+ * @author Andrew John Hughes ([EMAIL PROTECTED])
+ * @since 1.5
+ */
+public class MBeanServerNotification
+  extends Notification
+{
+
+  /**
+   * Compatible with JDK 1.5
+   */
+  private static final long serialVersionUID = 2876477500475969677L;
+
+  /**
+   * Notification type for the registration event.
+   */
+  public static final String REGISTRATION_NOTIFICATION = 
"JMX.mbean.registered";
+
+  /**
+   * Notification type for the de-registration event.
+   */
+  public static final String UNREGISTRATION_NOTIFICATION = 
"JMX.mbean.unregistered";
+
+  /**
+   * The name of the bean which forms the subject of this notification.
+   */
+  private ObjectName objectName;
+
+  /**
+   * Constructs a new [EMAIL PROTECTED] MBeanServerNotification} of the 
specified
+   * type for an event relating to the supplied bean, with the given
+   * source and sequence number.
+   *
+   * @param type the type of notification (registration or de-registration).
+   * @param source the source of the notification.
+   * @param seqNo the sequence number of this notification, used to order
+   *              multiple such notifications.
+   * @param name the name of the bean concerned by this event.
+   */
+  public MBeanServerNotification(String type, Object source, long seqNo,
+                                ObjectName name)
+  {
+    super(type, source, seqNo);
+    objectName = name;
+  }
+
+  /**
+   * Returns the name of the bean this notification concerns.
+   *
+   * @return the name of the bean.
+   */
+  public ObjectName getMBeanName()
+  {
+    return objectName;
+  }
+
+}

Attachment: signature.asc
Description: Digital signature

Reply via email to