User: schaefera
  Date: 02/03/10 20:31:33

  Added:       src/main/org/jboss/management/mejb
                        ClientNotificationListener.java
                        JMSClientNotificationListener.java
                        JMSNotificationListener.java
                        JMSNotificationListenerMBean.java
                        ListenerMBean.java ListenerRegistration.java
                        ManagementBean.java
                        PollingClientNotificationListener.java
                        PollingNotificationListener.java
                        PollingNotificationListenerMBean.java
                        RMIClientNotificationListener.java
                        RMIClientNotificationListenerInterface.java
                        RMINotificationListener.java
                        RMINotificationListenerMBean.java
                        SearchClientNotificationListener.java
  Log:
  Moved the JSR-77 code to the new "management" module. It contains the
  specification implementation for MEJB and the JBoss implementation.
  It does not contain references to JBoss server.
  
  The only workaround there is that MEJB needs to use the JMX RemoteMBean-
  Server which is not available in JBossMX right now. Therefore I added
  this to a JAR achive under tools/lib.
  
  Revision  Changes    Path
  1.1                  
jboss-management/src/main/org/jboss/management/mejb/ClientNotificationListener.java
  
  Index: ClientNotificationListener.java
  ===================================================================
  /*
  * JBoss, the OpenSource J2EE webOS
  *
  * Distributable under LGPL license.
  * See terms of license at gnu.org.
  */
  package org.jboss.management.mejb;
  
  import java.io.Serializable;
  import java.rmi.RemoteException;
  import java.util.Random;
  
  import javax.management.InstanceNotFoundException;
  import javax.management.InstanceAlreadyExistsException;
  import javax.management.JMException;
  import javax.management.MalformedObjectNameException;
  import javax.management.MBeanRegistrationException;
  import javax.management.MBeanException;
  import javax.management.NotCompliantMBeanException;
  import javax.management.Notification;
  import javax.management.NotificationFilter;
  import javax.management.NotificationListener;
  import javax.management.ObjectInstance;
  import javax.management.ObjectName;
  import javax.management.ReflectionException;
  
  import org.jboss.jmx.connector.RemoteMBeanServer;
  
  /**
  * Basic Local Listener to receive Notification from a remote JMX Agent
  **/
  public abstract class ClientNotificationListener {
  
     private ObjectName               mSender;
     private ObjectName               mRemoteListener;
     protected NotificationListener   mClientListener;
     protected Object                 mHandback;
     private Random                   mRandom = new Random();
     
     public ClientNotificationListener(
        ObjectName pSender,
        NotificationListener pClientListener,
        Object pHandback
     ) {
        mSender = pSender;
        mClientListener = pClientListener;
        mHandback = pHandback;
     }
     
     public ObjectName createListener(
        MEJB pConnector,
        String mClass,
        Object[] pParameters,
        String[] pSignatures
     ) throws
        MalformedObjectNameException,
        ReflectionException,
        MBeanRegistrationException,
        MBeanException,
        NotCompliantMBeanException
     {
        ObjectName lName = null;
        while( lName == null ) {
           try {
              lName = new ObjectName( "JMX:type=listener,id=" + mRandom.nextLong() );
              ObjectInstance lInstance = pConnector.createMBean(
                 mClass,
                 lName,
                 pParameters,
                 pSignatures
              );
              lName = lInstance.getObjectName();
           }
           catch( InstanceAlreadyExistsException iaee ) {
              lName = null;
           }
           catch( RemoteException re ) {
              lName = null;
           }
        }
        mRemoteListener = lName;
        return lName;
     }
  
     public void addNotificationListener(
        MEJB pConnector,
        NotificationFilter pFilter
     ) throws
        InstanceNotFoundException,
        RemoteException
     {
        pConnector.addNotificationListener(
           mSender,
           mRemoteListener,
           pFilter,
           null
        );
     }
     
    public void removeNotificationListener(
        MEJB pConnector
     ) throws
        InstanceNotFoundException,
        RemoteException
     {
        try {
           pConnector.removeNotificationListener(
              mSender,
              mRemoteListener
           );
        }
        catch( JMException jme ) {
        }
        try {
           pConnector.unregisterMBean( mRemoteListener );
        }
        catch( JMException jme ) {
        }
     }
     
     public ObjectName getSenderMBean() {
        return mSender;
     }
     
     public ObjectName getRemoteListenerName() {
        return mRemoteListener;
     }
  
     public boolean equals( Object pTest ) {
        if( pTest instanceof ClientNotificationListener ) {
           ClientNotificationListener lListener = (ClientNotificationListener) pTest;
           return
              mSender.equals( lListener.mSender ) &&
              mClientListener.equals( lListener.mClientListener );
        }
        return false;
     }
  
  }
  
  
  
  1.1                  
jboss-management/src/main/org/jboss/management/mejb/JMSClientNotificationListener.java
  
  Index: JMSClientNotificationListener.java
  ===================================================================
  /*
  * JBoss, the OpenSource J2EE webOS
  *
  * Distributable under LGPL license.
  * See terms of license at gnu.org.
  */
  package org.jboss.management.mejb;
  
  import java.io.Serializable;
  import java.rmi.RemoteException;
  import java.util.Hashtable;
  
  import javax.jms.JMSException;
  import javax.jms.Message;
  import javax.jms.MessageListener;
  import javax.jms.ObjectMessage;
  import javax.jms.Queue;
  import javax.jms.QueueConnection;
  import javax.jms.QueueConnectionFactory;
  import javax.jms.QueueReceiver;
  import javax.jms.QueueSender;
  import javax.jms.QueueSession;
  import javax.jms.Session;
  
  import javax.management.JMException;
  import javax.management.Notification;
  import javax.management.NotificationFilter;
  import javax.management.NotificationListener;
  import javax.management.ObjectName;
  
  import javax.naming.Context;
  import javax.naming.InitialContext;
  import javax.naming.NamingException;
  import javax.rmi.PortableRemoteObject;
  import javax.rmi.PortableRemoteObject;
  
  import org.jboss.jmx.connector.RemoteMBeanServer;
  
  /**
  * Local JMS Listener to receive the message and send to the listener
  **/
  public class JMSClientNotificationListener
     extends ClientNotificationListener
     implements MessageListener
  {
  
     public JMSClientNotificationListener(
        ObjectName pSender,
        NotificationListener pClientListener,
        Object pHandback,
        NotificationFilter pFilter,
        String pQueueJNDIName,
        String pServerName,
        MEJB pConnector
     ) throws
        JMSException,
        JMException,
        NamingException,
        RemoteException
     {
        super( pSender, pClientListener, pHandback );
  
        // Get the JMS QueueConnectionFactory from the J2EE server
        QueueConnection lConnection = getQueueConnection( pServerName, pQueueJNDIName 
);
        // Create JMS Session and create temporary Queue
        QueueSession lSession = lConnection.createQueueSession( false, 
Session.AUTO_ACKNOWLEDGE );
        Queue lQueue = lSession.createTemporaryQueue();
        // Register the listener as MBean on the remote JMX server
        createListener(
           pConnector,
           "org.jboss.management.mejb.JMSNotificationListener",
           new Object[] { pQueueJNDIName, lQueue },
           new String[] { String.class.getName(), Queue.class.getName() }
        );
        // Create JMS message receiver, create local message listener and set it as 
message
        // listener to the receiver
        QueueReceiver lReceiver = lSession.createReceiver( lQueue, null );
        lReceiver.setMessageListener( this );
        addNotificationListener( pConnector, pFilter );
     }
  
     public void onMessage( Message pMessage ) {
        try {
           // Unpack the Notification from the Message and hand it over to the clients
           // Notification Listener
           Notification lNotification = (Notification) ( (ObjectMessage) pMessage 
).getObject();
           mClientListener.handleNotification( lNotification, mHandback );
        }
        catch( JMSException je ) {
           je.printStackTrace();
        }
     }
  
     /**
     * Creates a SurveyManagement bean.
     *
     * @return Returns a SurveyManagement bean for use by the Survey handler.
     **/
     private QueueConnection getQueueConnection( String pServerName, String 
pQueueJNDIName )
        throws NamingException, JMSException
     {
        Context lJNDIContext = null;
        if( pServerName != null ) {
           Hashtable lProperties = new Hashtable();
           lProperties.put( Context.PROVIDER_URL, pServerName );
           lJNDIContext = new InitialContext( lProperties );
        } else {
           lJNDIContext = new InitialContext();
        }
        Object aRef = lJNDIContext.lookup( pQueueJNDIName );
        QueueConnectionFactory aFactory = (QueueConnectionFactory) 
           PortableRemoteObject.narrow( aRef, QueueConnectionFactory.class );
        QueueConnection lConnection = aFactory.createQueueConnection();
        lConnection.start();
        return lConnection;
     }
     
  }
  
  
  
  1.1                  
jboss-management/src/main/org/jboss/management/mejb/JMSNotificationListener.java
  
  Index: JMSNotificationListener.java
  ===================================================================
  /*
  * JBoss, the OpenSource J2EE webOS
  *
  * Distributable under LGPL license.
  * See terms of license at gnu.org.
  */
  package org.jboss.management.mejb;
  
  import java.io.Serializable;
  
  import javax.jms.JMSException;
  import javax.jms.Message;
  import javax.jms.MessageListener;
  import javax.jms.ObjectMessage;
  import javax.jms.Queue;
  import javax.jms.QueueConnection;
  import javax.jms.QueueConnectionFactory;
  import javax.jms.QueueReceiver;
  import javax.jms.QueueSender;
  import javax.jms.QueueSession;
  import javax.jms.Session;
  
  import javax.management.Notification;
  import javax.management.NotificationListener;
  
  import javax.naming.Context;
  import javax.naming.InitialContext;
  import javax.naming.NamingException;
  import javax.rmi.PortableRemoteObject;
  
  /**
  * Remote Listener using JMS to send the event
  **/
  public class JMSNotificationListener
     implements JMSNotificationListenerMBean
  {
  
     // JMS Queue Session and Sender must be created on the server-side
     // therefore they are transient and created on the first notification
     // call
     private transient QueueSender mSender;
     private transient QueueSession mSession;
     private String mJNDIName;
     private Queue mQueue;
     
     public JMSNotificationListener(
        String pJNDIName,
        Queue pQueue
     ) throws JMSException
     {
        mJNDIName = pJNDIName;
        mQueue = pQueue;
     }
  
     /**
     * Handles the given notification by sending this to the remote
     * client listener
     *
     * @param pNotification                             Notification to be send
     * @param pHandback                                 Handback object
     */
     public void handleNotification(
        Notification pNotification,
        Object pHandback
     ) {
        try {
           if( mSender == null ) {
              // Get QueueConnectionFactory, create Connection, Session and then Sender
              QueueConnection lConnection = getQueueConnection( mJNDIName );
              mSession = lConnection.createQueueSession( false, 
Session.AUTO_ACKNOWLEDGE );
              mSender = ( (QueueSession) mSession).createSender( mQueue );
           }
           // Create a message and send to the Queue
           Message lMessage = mSession.createObjectMessage( pNotification );
           mSender.send( lMessage );
        }
        catch( Exception e ) {
           e.printStackTrace();
        }
     }
  
     /**
     * Test if this and the given Object are equal. This is true if the given
     * object both refer to the same local listener
     *
     * @param pTest                                             Other object to test 
if equal
     *
     * @return                                                  True if both are of 
same type and
     *                                                                  refer to the 
same local listener
     **/
     public boolean equals( Object pTest ) {
        if( pTest instanceof JMSNotificationListener ) {
           try {
              return mQueue.getQueueName().equals(
                 ( (JMSNotificationListener) pTest).mQueue.getQueueName()
              );
           }
           catch( JMSException je ) {
              je.printStackTrace();
           }
        }
        return false;
     }
  
     /**
     * @return                                                  Hashcode of the local 
listener
     **/
     public int hashCode() {
        return mQueue.hashCode();
     }
  
     /**
     * Creates a SurveyManagement bean.
     *
     * @return Returns a SurveyManagement bean for use by the Survey handler.
     **/
     private QueueConnection getQueueConnection( String pJNDIName )
        throws NamingException, JMSException
     {
        Context aJNDIContext = new InitialContext();
        Object aRef = aJNDIContext.lookup( pJNDIName );
        QueueConnectionFactory aFactory = (QueueConnectionFactory) 
           PortableRemoteObject.narrow( aRef, QueueConnectionFactory.class );
        QueueConnection lConnection = aFactory.createQueueConnection();
        lConnection.start();
        return lConnection;
     }
  }
  
  
  
  1.1                  
jboss-management/src/main/org/jboss/management/mejb/JMSNotificationListenerMBean.java
  
  Index: JMSNotificationListenerMBean.java
  ===================================================================
  /*
  * JBoss, the OpenSource J2EE webOS
  *
  * Distributable under LGPL license.
  * See terms of license at gnu.org.
  */
  package org.jboss.management.mejb;
  
  import javax.management.Notification;
  import javax.management.NotificationListener;
  
  /**
  * MBean Interface of a Notification Listener MBean
  * using JMS to send the notifications back to the client.
  * <br>
  * This interface is only necessary because of the naming
  * conventions for standard MBeans.
  *
  * @author <A href="mailto:[EMAIL PROTECTED]";>Andreas &quot;Mad&quot; Schaefer</A>
  **/
  public interface JMSNotificationListenerMBean
     extends ListenerMBean
  {
  
        // Constants -----------------------------------------------------
  
        // Static --------------------------------------------------------
  
        // Public --------------------------------------------------------
  
  }
  
  
  
  1.1                  
jboss-management/src/main/org/jboss/management/mejb/ListenerMBean.java
  
  Index: ListenerMBean.java
  ===================================================================
  /*
  * JBoss, the OpenSource J2EE webOS
  *
  * Distributable under LGPL license.
  * See terms of license at gnu.org.
  */
  package org.jboss.management.mejb;
  
  import javax.management.Notification;
  import javax.management.NotificationListener;
  
  /**
  * MBean Interface of a Notification Listener MBean
  *
  * @author <A href="mailto:[EMAIL PROTECTED]";>Andreas &quot;Mad&quot; Schaefer</A>
  **/
  public interface ListenerMBean
     extends NotificationListener
  {
  
        // Constants -----------------------------------------------------
  
        // Static --------------------------------------------------------
  
        // Public --------------------------------------------------------
     
        /**
        * Handles the given notifcation event and passed it to the registered
        * listener
        *
        * @param pNotification                          NotificationEvent
        * @param pHandback                                      Handback object
        *
        * @throws RemoteException                       If a Remote Exception occurred
        */
        public void handleNotification(
                Notification pNotification,
                Object pHandback
        );
  }
  
  
  
  1.1                  
jboss-management/src/main/org/jboss/management/mejb/ListenerRegistration.java
  
  Index: ListenerRegistration.java
  ===================================================================
  /*
   * JBoss, the OpenSource J2EE webOS
   *
   * Distributable under LGPL license.
   * See terms of license at gnu.org.
   */
  package org.jboss.management.mejb;
  
  import java.security.InvalidParameterException;
  import java.rmi.RemoteException;
  import java.util.ArrayList;
  import java.util.List;
  
  import javax.ejb.CreateException;
  import javax.management.InstanceNotFoundException;
  import javax.management.ListenerNotFoundException;
  import javax.management.NotificationFilter;
  import javax.management.NotificationListener;
  import javax.management.ObjectName;
  import javax.management.j2ee.ManagementHome;
  
  import org.jboss.management.mejb.MEJB;
  
  /**
   * Root class of the JBoss JSR-77 implementation of
   * {@link javax.management.j2ee.ListenerRegistration ListenerRegistration}.
   *
   * @author  <a href="mailto:[EMAIL PROTECTED]";>Andreas Schaefer</a>.
   * @version $Revision: 1.1 $
   *   
   * <p><b>Revisions:</b>
   *
   * <p><b>20011205 Andreas Schaefer:</b>
   * <ul>
   * <li> Creation
   * </ul>
   **/
  public class ListenerRegistration
     implements javax.management.j2ee.ListenerRegistration
  {
     // Constants -----------------------------------------------------
     
     public static final int NOTIFICATION_TYPE_RMI = 0;
     public static final int NOTIFICATION_TYPE_JMS = 1;
     public static final int NOTIFICATION_TYPE_POLLING = 2;
     
     // Attributes ----------------------------------------------------
     
     private ManagementHome mHome;
     private int mEventType = NOTIFICATION_TYPE_RMI;
     private String[] mOptions;
     private List mListeners = new ArrayList();
     
     // Static --------------------------------------------------------
     
     // Constructors --------------------------------------------------
     
     public ListenerRegistration( ManagementHome pHome, String[] pOptions ) {
        if( pHome == null ) {
           throw new InvalidParameterException( "Home Interface must be specified" );
        }
        mHome = pHome;
        mOptions = pOptions;
     }
     
     // Public --------------------------------------------------------
     
     // javax.management.j2ee.ListenerRegistration implementation -----
     
     public void addNotificationListener(
        ObjectName pName,
        NotificationListener pListener,
        NotificationFilter pFilter,
        Object pHandback
     )
        throws
           InstanceNotFoundException,
           RemoteException
     {
        MEJB lManagement = null;
        // Create the remote MBean and register it
        try {
           // Get EJB
           lManagement = getMEJB();
           ClientNotificationListener lListener = null;
           switch( mEventType ) {
              case NOTIFICATION_TYPE_RMI:
                 lListener = new RMIClientNotificationListener(
                    pName,
                    pListener,
                    pHandback,
                    pFilter,
                    lManagement
                 );
                 break;
              case NOTIFICATION_TYPE_JMS:
                 lListener = new JMSClientNotificationListener(
                    pName,
                    pListener,
                    pHandback,
                    pFilter,
                    mOptions[ 0 ],
                    mOptions[ 1 ], // JNDI-Server name
                    lManagement
                 );
                 break;
              case NOTIFICATION_TYPE_POLLING:
                 lListener = new PollingClientNotificationListener(
                    pName,
                    pListener,
                    pHandback,
                    pFilter,
                    5000, // Sleeping Period
                    2500, // Maximum Pooled List Size
                    lManagement
                 );
           }
           // Add this listener on the client to remove it when the client goes down
           mListeners.add( lListener );
        }
        catch( Exception e ) {
           if( e instanceof RuntimeException ) {
              throw (RuntimeException) e;
           }
           if( e instanceof InstanceNotFoundException ) {
              throw (InstanceNotFoundException) e;
           }
           throw new RuntimeException( "Remote access to perform this operation 
failed: " + e.getMessage() );
        }
        finally {
           if( lManagement != null ) {
              try {
                 lManagement.remove();
              }
              catch( Exception e ) {
                 e.printStackTrace();
              }
           }
        }
     }
     
     public void removeNotificationListener(
        ObjectName pName,
        NotificationListener pListener
     )
        throws
           InstanceNotFoundException,
           ListenerNotFoundException,
           RemoteException
     {
        MEJB lManagement = null;
        try {
           // Get EJB
           lManagement = getMEJB();
     
           ClientNotificationListener lCheck = new SearchClientNotificationListener( 
pName, pListener );
           int i = mListeners.indexOf( lCheck );
           if( i >= 0 ) {
              ClientNotificationListener lListener = (ClientNotificationListener) 
mListeners.get( i );
              lListener.removeNotificationListener( lManagement );
           }
        }
        catch( Exception e ) {
           if( e instanceof RuntimeException ) {
              throw (RuntimeException) e;
           }
           if( e instanceof InstanceNotFoundException ) {
              throw (InstanceNotFoundException) e;
           }
           throw new RuntimeException( "Remote access to perform this operation 
failed: " + e.getMessage() );
        }
        finally {
           if( lManagement != null ) {
              try {
                 lManagement.remove();
              }
              catch( Exception e ) {
                 e.printStackTrace();
              }
           }
        }
     }
     
     // Y overrides ---------------------------------------------------
     
     // Package protected ---------------------------------------------
     
     // Protected -----------------------------------------------------
     
     // Private -------------------------------------------------------
     
     private MEJB getMEJB()
        throws
           CreateException,
           RemoteException
     {
  /*
        System.out.println( "ListenerRegistration.getMEJB(), home is: " + mHome );
        System.out.println( "ListenerRegistration.getMEJB(), home methods are: " +
           java.util.Arrays.asList( mHome.getClass().getDeclaredMethods() )
        );
  */
        try {
           Object lTemp = mHome.create();
           MEJB lReturn = (MEJB) lTemp;
           return lReturn;
  //         return (MEJB) ( mHome.create() );
        }
        catch( Error e ) {
           e.printStackTrace();
           throw e;
        }
     }
     
     // Inner classes -------------------------------------------------
     
  }
  
  
  
  1.1                  
jboss-management/src/main/org/jboss/management/mejb/ManagementBean.java
  
  Index: ManagementBean.java
  ===================================================================
  /*
   * JBoss, the OpenSource J2EE webOS
   *
   * Distributable under LGPL license.
   * See terms of license at gnu.org.
   */
  package org.jboss.management.mejb;
  
  import java.util.ArrayList;
  import java.util.Collection;
  import java.util.Iterator;
  import java.util.Set;
  import java.rmi.RemoteException;
  
  import javax.ejb.CreateException;
  import javax.ejb.EJBException;
  import javax.ejb.FinderException;
  import javax.ejb.RemoveException;
  import javax.ejb.SessionBean;
  import javax.ejb.SessionContext;
  import javax.management.Attribute;
  import javax.management.AttributeList;
  import javax.management.AttributeNotFoundException;
  import javax.management.InvalidAttributeValueException;
  import javax.management.InstanceNotFoundException;
  import javax.management.InstanceAlreadyExistsException;
  import javax.management.MBeanException;
  import javax.management.MBeanInfo;
  import javax.management.MBeanRegistrationException;
  import javax.management.MBeanServer;
  import javax.management.MBeanServerFactory;
  import javax.management.IntrospectionException;
  import javax.management.ListenerNotFoundException;
  import javax.management.NotCompliantMBeanException;
  import javax.management.NotificationFilter;
  import javax.management.NotificationListener;
  import javax.management.ObjectName;
  import javax.management.ObjectInstance;
  import javax.management.QueryExp;
  import javax.management.ReflectionException;
  import javax.management.j2ee.ManagementHome;
  import javax.naming.Context;
  import javax.naming.InitialContext;
  import javax.naming.NamingException;
  
  import org.jboss.jmx.connector.RemoteMBeanServer;
  import org.jboss.management.j2ee.J2EEManagedObject;
  
  /**
  * Management Session Bean to enable the client to manage the
  * server its is deployed on.
  *
  * @author <a href="mailto:[EMAIL PROTECTED]";>Marc Fleury</a>
  * @author <a href="mailto:[EMAIL PROTECTED]";>Andreas Schaefer</a>
  * @version $Revision: 1.1 $
  *
  * @ejb:bean name="MEJB"
  *           display-name="JBoss Management EJB (MEJB)"
  *           type="Stateless"
  *           jndi-name="ejb/mgmt/J2EEDomain"
  * @--ejb:interface generate="none"
  *                remote-class="javax.management.j2ee.Management"
  * @ejb:interface extends="javax.management.j2ee.Management"
  * @--ejb:home extends="javax.management.j2ee.ManagementHome"
  * @ejb:home generate="none"
  *           remote-class="javax.management.j2ee.ManagementHome"
  * @ejb:env-entry description="JNDI-Name of the MBeanServer to be used to look it up. 
If 'null' the first of all listed local MBeanServer is taken"
  *                name="Server-Name"
  *                value="null"
  *
  **/
  public class ManagementBean
     implements SessionBean
  {
     // -------------------------------------------------------------------------
     // Static
     // -------------------------------------------------------------------------
     
     // -------------------------------------------------------------------------
     // Members 
     // -------------------------------------------------------------------------
     
     private SessionContext mContext;
     /**
     * Reference to the MBeanServer all the methods of this Connector are
     * forwarded to
     **/
     private RemoteMBeanServer mConnector;
     
     // -------------------------------------------------------------------------
     // Methods
     // -------------------------------------------------------------------------  
     
     /**
     * @throws RemoteException Necessary for a EJB
     *
     * @ejb:interface-method view-type="remote"
     **/
     public Object getAttribute( ObjectName pName, String pAttribute )
        throws
           MBeanException,
           AttributeNotFoundException,
           InstanceNotFoundException,
           ReflectionException,
           RemoteException
     {
        return mConnector.getAttribute( pName, pAttribute );
     }
     
     /**
     * @throws RemoteException Necessary for a EJB
     *
     * @ejb:interface-method view-type="remote"
     **/
     public AttributeList getAttributes( ObjectName pName, String[] pAttributes )
        throws
           InstanceNotFoundException,
           ReflectionException,
           RemoteException
     {
        return mConnector.getAttributes( pName, pAttributes );
     }
     
     /**
     * @throws RemoteException Necessary for a EJB
     *
     * @ejb:interface-method view-type="remote"
     **/
     public String getDefaultDomain()
        throws RemoteException
     {
        return J2EEManagedObject.getDomainName();
     }
     
     /**
     * @throws RemoteException Necessary for a EJB
     *
     * @ejb:interface-method view-type="remote"
     **/
     public Integer getMBeanCount()
        throws RemoteException
     {
        try {
           return new Integer(
              queryNames(
                 new ObjectName( getDefaultDomain() + ":*" )
              ).size()
           );
        }
        catch( Exception e ) {
        }
        return new Integer( 0 );
     }
     
     /**
     * @throws RemoteException Necessary for a EJB
     *
     * @ejb:interface-method view-type="remote"
     **/
     public MBeanInfo getMBeanInfo( ObjectName pName )
        throws
           IntrospectionException,
           InstanceNotFoundException,
           ReflectionException,
           RemoteException
     {
        return mConnector.getMBeanInfo( pName );
     }
     
     /**
     * @throws RemoteException Necessary for a EJB
     *
     * @ejb:interface-method view-type="remote"
     **/
     public javax.management.j2ee.ListenerRegistration getListenerRegistry()
        throws RemoteException
     {
        return new ListenerRegistration(
           (ManagementHome) mContext.getEJBObject().getEJBHome(),
           new String[] {}
        );
     }
     
     /**
      * @throws RemoteException Necessary for a EJB
      *
      * @ejb:interface-method view-type="remote"
      **/
     public Object invoke( ObjectName pName, String pOperationName, Object[] pParams, 
String[] pSignature )
        throws
           InstanceNotFoundException,
           MBeanException,
           ReflectionException,
           RemoteException
     {
        // Convert start(), startRecursive() and stop() to the
        // internal methods: mejbStart(), mejbStartRecursive() and mejbStop
        if( pOperationName.equals( "start" ) ) {
           pOperationName = "mejbStart";
        } else
        if( pOperationName.equals( "startRecursive" ) ) {
           pOperationName = "mejbStartRecursive";
        } else
        if( pOperationName.equals( "stop" ) ) {
           pOperationName = "mejbStop";
        }
        return mConnector.invoke(
           pName,
           pOperationName,
           pParams,
           pSignature
        );
     }
     
     /**
      * @throws RemoteException Necessary for a EJB
      *
      * @ejb:interface-method view-type="remote"
      **/
     public boolean isRegistered( ObjectName pName )
        throws RemoteException
     {
        return mConnector.isRegistered( pName );
     }
     
     /**
      * @throws RemoteException Necessary for a EJB
      *
      * @ejb:interface-method view-type="remote"
      **/
     public Set queryNames( ObjectName pName )
        throws RemoteException
     {
        return mConnector.queryNames( pName, null );
     }
     
     /**
      * @throws RemoteException Necessary for a EJB
      *
      * @ejb:interface-method view-type="remote"
      **/
     public void setAttribute( ObjectName pName, Attribute pAttribute )
        throws
           AttributeNotFoundException,
           InstanceNotFoundException,
           InvalidAttributeValueException,
           MBeanException,
           ReflectionException,
           RemoteException
     {
        mConnector.setAttribute( pName, pAttribute );
     }
     
     /**
      * @throws RemoteException Necessary for a EJB
      *
      * @ejb:interface-method view-type="remote"
      **/
     public AttributeList setAttributes( ObjectName pName, AttributeList pAttributes )
        throws
           InstanceNotFoundException,
           ReflectionException,
           RemoteException
     {
        return mConnector.setAttributes( pName, pAttributes );
     }
     
     /**
      * @throws RemoteException Necessary for a EJB
      *
      * @ejb:interface-method view-type="remote"
      **/
     public ObjectInstance createMBean(
        String pClass,
        ObjectName pName,
        Object[] pParameters,
        String[] pSignature
     )
        throws
           InstanceAlreadyExistsException,
           MBeanException,
           MBeanRegistrationException,
           NotCompliantMBeanException,
           ReflectionException,
           RemoteException
     {
        try {
           return mConnector.createMBean( pClass, pName, pParameters, pSignature );
        }
        catch( ReflectionException e1 ) {
           e1.printStackTrace();
           throw e1;
        }
     }
     
     /**
      * @throws RemoteException Necessary for a EJB
      *
      * @ejb:interface-method view-type="remote"
      **/
     public void unregisterMBean(
        ObjectName pName
     )
        throws
           InstanceNotFoundException,
           MBeanRegistrationException,
           RemoteException
     {
        mConnector.unregisterMBean( pName );
     }
     
     /**
      * @throws RemoteException Necessary for a EJB
      *
      * @ejb:interface-method view-type="remote"
      **/
     public void addNotificationListener(
        ObjectName pBroadcaster,
        ObjectName pListener,
        NotificationFilter pFilter,
        Object pHandback
     )
        throws
           InstanceNotFoundException,
           RemoteException
     {
        mConnector.addNotificationListener( pBroadcaster, pListener, pFilter, 
pHandback );
     }
     
     /**
      * @throws RemoteException Necessary for a EJB
      *
      * @ejb:interface-method view-type="remote"
      **/
     public void removeNotificationListener(
        ObjectName pBroadcaster,
        ObjectName pListener
     )
        throws
           InstanceNotFoundException,
           ListenerNotFoundException,
           RemoteException
     {
        mConnector.removeNotificationListener( pBroadcaster, pListener );
     }
     
     /**
     * Create the Session Bean which takes the first available
     * MBeanServer as target server
     *
     * @throws CreateException 
     *
     * @ejb:create-method
     **/
     public void ejbCreate()
        throws
           CreateException
     {
        if( mConnector == null ) {
           try {
              Context aJNDIContext = new InitialContext();
              String lServerName = ( (String) aJNDIContext.lookup( 
                 "java:comp/env/Server-Name" 
              ) ).trim();
              if( lServerName == null || lServerName.length() == 0 || 
lServerName.equals( "null" ) ) {
                 ArrayList lServers = MBeanServerFactory.findMBeanServer( null );
                 if( lServers.size() > 0 ) {
                    mConnector = new LocalConnector( (MBeanServer) lServers.get( 0 ) );
                 } else {
                    throw new CreateException(
                       "No local JMX MBeanServer available"
                    );
                 }
              } else {
                 Object lServer = aJNDIContext.lookup( lServerName );
                 if( lServer != null ) {
                    if( lServer instanceof MBeanServer ) {
                       mConnector = new LocalConnector( (MBeanServer) lServer );
                    } else
                    if( lServer instanceof RemoteMBeanServer ) {
                       mConnector = (RemoteMBeanServer) lServer;
                    } else {
                       throw new CreateException(
                          "Server: " + lServer + " reference by Server-Name: " + 
lServerName +
                          " is not of type MBeanServer or RemoteMBeanServer: "
                       );
                    }
                 } else {
                    throw new CreateException(
                       "Server-Name " + lServerName + " does not reference an Object 
in JNDI"
                    );
                 }
              }
           }
           catch( NamingException ne ) {
              throw new EJBException( ne );
           }
        }
     }
     
     /**
     * Describes the instance and its content for debugging purpose
     *
     * @return Debugging information about the instance and its content
     **/
     public String toString()
     {
        return "Management [ " + " ]";
     }
     
     // -------------------------------------------------------------------------
     // Framework Callbacks
     // -------------------------------------------------------------------------  
     
     /**
     * Set the associated session context. The container invokes this method on 
     * an instance after the instance has been created. 
     * <p>This method is called with no transaction context.
     *
     * @param aContext A SessionContext interface for the instance. The instance 
     *  should store the reference to the context in an instance variable.
     * @throws EJBException Should something go wrong while seting the context,
     *  an EJBException will be thrown.
     **/
     public void setSessionContext( SessionContext aContext )
        throws
           EJBException
     {
        mContext = aContext;
     }
     
     
     /**
     * The activate method is called when the instance is activated from its 
     * "passive" state. The instance should acquire any resource that it has 
     * released earlier in the ejbPassivate() method. 
     * <p>This method is called with no transaction context.
     *
     * @throws EJBException Thrown by the method to indicate a failure caused 
     *  by a system-level error
     **/
     public void ejbActivate()
        throws
           EJBException
     {
     }
     
     
     /**
     * The passivate method is called before the instance enters the "passive" 
     * state. The instance should release any resources that it can re-acquire 
     * later in the ejbActivate() method. 
     * <p>After the passivate method completes, the instance must be in a state 
     * that allows the container to use the Java Serialization protocol to 
     * externalize and store away the instance's state. 
     * <p>This method is called with no transaction context.
     *
     * @throws EJBException Thrown by the method to indicate a failure caused 
     *  by a system-level error
     **/
     public void ejbPassivate()
        throws
           EJBException
     {
     }
     
     
     /**
     * A container invokes this method before it ends the life of the session 
     * object. This happens as a result of a client's invoking a remove 
     * operation, or when a container decides to terminate the session object 
     * after a timeout. 
     * <p>This method is called with no transaction context.
     *
     * @throws EJBException Thrown by the method to indicate a failure caused 
     *  by a system-level error
     **/
     public void ejbRemove()
        throws
           EJBException
     {
     }
  
     private class LocalConnector implements RemoteMBeanServer {
        
        private MBeanServer mServer = null;
        
        public LocalConnector( MBeanServer pServer ) {
           mServer = pServer;
        }
  
        public ObjectInstance createMBean(
           String pClassName,
           ObjectName pName
        ) throws
           ReflectionException,
           InstanceAlreadyExistsException,
           MBeanRegistrationException,
           MBeanException,
           NotCompliantMBeanException
        {
           return mServer.createMBean( pClassName, pName );
        }
        
        public ObjectInstance createMBean(
           String pClassName,
           ObjectName pName,
           ObjectName pLoaderName
        ) throws
           ReflectionException,
           InstanceAlreadyExistsException,
           MBeanRegistrationException,
           MBeanException,
           NotCompliantMBeanException,
           InstanceNotFoundException
        {
           return mServer.createMBean( pClassName, pName, pLoaderName );
        }
        
        public ObjectInstance createMBean(
           String pClassName,
           ObjectName pName,
           Object[] pParams,
           String[] pSignature
        ) throws
           ReflectionException,
           InstanceAlreadyExistsException,
           MBeanRegistrationException,
           MBeanException,
           NotCompliantMBeanException
        {
           return mServer.createMBean( pClassName, pName, pParams, pSignature );
        }
        
        public ObjectInstance createMBean(
           String pClassName,
           ObjectName pName,
           ObjectName pLoaderName,
           Object[] pParams,
           String[] pSignature
        ) throws
           ReflectionException,
           InstanceAlreadyExistsException,
           MBeanRegistrationException,
           MBeanException,
           NotCompliantMBeanException,
           InstanceNotFoundException
        {
           return mServer.createMBean( pClassName, pName, pLoaderName, pParams, 
pSignature );
        }
        
        public void unregisterMBean(
           ObjectName pName
        ) throws
           InstanceNotFoundException,
           MBeanRegistrationException
        {
           mServer.unregisterMBean( pName );
        }
        
        public ObjectInstance getObjectInstance(
           ObjectName pName
        ) throws
           InstanceNotFoundException
        {
           return mServer.getObjectInstance( pName );
        }
        
        public Set queryMBeans(
           ObjectName pName,
           QueryExp pQuery
        ) {
           return mServer.queryMBeans( pName, pQuery );
        }
        
        public Set queryNames(
           ObjectName pName,
           QueryExp pQuery
        ) {
           return mServer.queryNames( pName, pQuery );
        }
        
        public boolean isRegistered(
           ObjectName pName
        ) {
           return mServer.isRegistered( pName );
        }
        
        public boolean isInstanceOf(
           ObjectName pName,
           String pClassName
        ) throws
           InstanceNotFoundException
        {
           return mServer.isInstanceOf( pName, pClassName );
        }
        
        public Integer getMBeanCount(
        ) {
           return mServer.getMBeanCount();
        }
        
        public Object getAttribute(
           ObjectName pName,
           String pAttribute
        ) throws
           MBeanException,
           AttributeNotFoundException,
           InstanceNotFoundException,
           ReflectionException
        {
           return mServer.getAttribute( pName, pAttribute );
        }
        
        public AttributeList getAttributes(
           ObjectName pName,
           String[] pAttributes
        ) throws
           InstanceNotFoundException,
           ReflectionException
        {
           return mServer.getAttributes( pName, pAttributes );
        }
        
        public void setAttribute(
           ObjectName pName,
           Attribute pAttribute
        ) throws
           InstanceNotFoundException,
           AttributeNotFoundException,
           InvalidAttributeValueException,
           MBeanException,
           ReflectionException
        {
           mServer.setAttribute( pName, pAttribute );
        }
        
        public AttributeList setAttributes(
           ObjectName pName,
           AttributeList pAttributes
        ) throws
           InstanceNotFoundException,
           ReflectionException
        {
           return mServer.setAttributes( pName, pAttributes );
        }
        
        public Object invoke(
           ObjectName pName,
           String pActionName,
           Object[] pParams,
           String[] pSignature
        ) throws
           InstanceNotFoundException,
           MBeanException,
           ReflectionException
        {
           return mServer.invoke( pName, pActionName, pParams, pSignature );
        }
        
        public String getDefaultDomain(
        ) {
           return mServer.getDefaultDomain();
        }
        
        public MBeanInfo getMBeanInfo(
           ObjectName pName
        ) throws
           InstanceNotFoundException,
           IntrospectionException,
           ReflectionException
        {
           return mServer.getMBeanInfo( pName );
        }
        
        public void addNotificationListener(
           ObjectName pName,
           NotificationListener pListener,
           NotificationFilter pFilter,
           Object pHandback             
        ) throws
           InstanceNotFoundException
        {
           mServer.addNotificationListener( pName, pListener, pFilter, pHandback );
        }
        
        public void removeNotificationListener(
           ObjectName pName,
           NotificationListener pListener
        ) throws
           InstanceNotFoundException,
           ListenerNotFoundException
        {
           mServer.removeNotificationListener( pName, pListener );
        }
        
        public void addNotificationListener(
           ObjectName pName,
           ObjectName pListener,
           NotificationFilter pFilter,
           Object pHandback             
        ) throws
           InstanceNotFoundException
        {
           mServer.addNotificationListener( pName, pListener, pFilter, pHandback );
        }
        
        public void removeNotificationListener(
           ObjectName pName,
           ObjectName pListener
        ) throws
           InstanceNotFoundException,
           ListenerNotFoundException,
           UnsupportedOperationException
        {
           mServer.removeNotificationListener( pName, pListener );
        }
        
     }
  }
  
  
  
  1.1                  
jboss-management/src/main/org/jboss/management/mejb/PollingClientNotificationListener.java
  
  Index: PollingClientNotificationListener.java
  ===================================================================
  /*
  * JBoss, the OpenSource J2EE webOS
  *
  * Distributable under LGPL license.
  * See terms of license at gnu.org.
  */
  package org.jboss.management.mejb;
  
  import java.io.Serializable;
  import java.rmi.RemoteException;
  import java.util.Iterator;
  import java.util.List;
  
  import javax.management.JMException;
  import javax.management.Notification;
  import javax.management.NotificationFilter;
  import javax.management.NotificationListener;
  import javax.management.ObjectName;
  
  import org.jboss.jmx.connector.RemoteMBeanServer;
  
  /**
  * Local Polling Listener to receive the message and send to the listener
  **/
  public class PollingClientNotificationListener
     extends ClientNotificationListener
     implements Runnable
  {
  
     private MEJB                        mConnector;
     private int                         mSleepingPeriod = 2000;
     
     public PollingClientNotificationListener(
        ObjectName pSender,
        NotificationListener pClientListener,
        Object pHandback,
        NotificationFilter pFilter,
        int pSleepingPeriod,
        int pMaximumListSize,
        MEJB pConnector
     ) throws
        JMException,
        RemoteException
     {
        super( pSender, pClientListener, pHandback );
        if( pSleepingPeriod > 0 ) {
           mSleepingPeriod = pSleepingPeriod;
        }
        mConnector = pConnector;
        // Register the listener as MBean on the remote JMX server
        createListener(
           pConnector,
           "org.jboss.management.mejb.PollingNotificationListener",
           new Object[] { new Integer( pMaximumListSize ), new Integer( 
pMaximumListSize ) },
           new String[] { Integer.TYPE.getName(), Integer.TYPE.getName() }
        );
        addNotificationListener( pConnector, pFilter );
        new Thread( this ).start();
     }
  
     public void run() {
        while( true ) {
           try {
              try {
                 List lNotifications = (List) mConnector.invoke(
                    getRemoteListenerName(),
                    "getNotifications",
                    new Object[] {},
                    new String[] {}
                 );
                 Iterator i = lNotifications.iterator();
                 while( i.hasNext() ) {
                    Notification lNotification = (Notification) i.next();
                    mClientListener.handleNotification(
                       lNotification,
                       mHandback
                    );
                 }
              }
              catch( Exception e ) {
                 System.out.println( 
"PollingClientNotificationListener.getNotifications() got exception " + e );
              }
              Thread.sleep( mSleepingPeriod );
           }
           catch( InterruptedException ie ) {
           }
        }
     }
  }
  
  
  
  1.1                  
jboss-management/src/main/org/jboss/management/mejb/PollingNotificationListener.java
  
  Index: PollingNotificationListener.java
  ===================================================================
  /*
  * JBoss, the OpenSource J2EE webOS
  *
  * Distributable under LGPL license.
  * See terms of license at gnu.org.
  */
  package org.jboss.management.mejb;
  
  import java.io.Serializable;
  import java.util.ArrayList;
  import java.util.List;
  
  import javax.management.Notification;
  import javax.management.NotificationListener;
  
  /**
  * Remote Listener using Polling to send the event
  **/
  public class PollingNotificationListener
     implements PollingNotificationListenerMBean
  {
  
     private List mList;
     private int mMaximumSize = 1000;
     
     public PollingNotificationListener(
        int pListSize,
        int pMaximumListSize
     ) {
        if( pListSize <= 0 ) {
           pListSize = 1000;
        }
        mList = new ArrayList( pListSize );
        if( pMaximumListSize > 0 && pMaximumListSize > pListSize ) {
           mMaximumSize = pMaximumListSize;
        }
     }
  
     /**
     * Handles the given notification by sending this to the remote
     * client listener
     *
     * @param pNotification                             Notification to be send
     * @param pHandback                                 Handback object
     */
     public void handleNotification(
        Notification pNotification,
        Object pHandback
     ) {
        synchronized( mList ) {
           if( mList.size() <= mMaximumSize ) { 
              mList.add( pNotification );
           }
        }
     }
  
     public List getNotifications() {
        return getNotifications( mMaximumSize );
     }
  
     public List getNotifications( int pMaxiumSize ) {
        List lReturn = null;
        synchronized( mList ) {
           pMaxiumSize = pMaxiumSize > mList.size() ? mList.size() : pMaxiumSize;
           lReturn = new ArrayList( mList.subList( 0, pMaxiumSize ) );
           mList.removeAll( lReturn );
        }
        
        return lReturn;
     }
  
  }
  
  
  
  1.1                  
jboss-management/src/main/org/jboss/management/mejb/PollingNotificationListenerMBean.java
  
  Index: PollingNotificationListenerMBean.java
  ===================================================================
  /*
  * JBoss, the OpenSource J2EE webOS
  *
  * Distributable under LGPL license.
  * See terms of license at gnu.org.
  */
  package org.jboss.management.mejb;
  
  import java.util.List;
  
  import javax.management.Notification;
  import javax.management.NotificationListener;
  
  /**
  * MBean Interface of a Notification Listener MBean
  * using Polling to send the notifications back to the client.
  * <br>
  * This interface is only necessary because of the naming
  * conventions for standard MBeans.
  *
  * @author <A href="mailto:[EMAIL PROTECTED]";>Andreas &quot;Mad&quot; Schaefer</A>
  **/
  public interface PollingNotificationListenerMBean
     extends ListenerMBean
  {
  
        // Constants -----------------------------------------------------
  
        // Static --------------------------------------------------------
  
        // Public --------------------------------------------------------
  
     public List getNotifications();
  
     public List getNotifications( int pMaxiumSize );
  
  }
  
  
  
  1.1                  
jboss-management/src/main/org/jboss/management/mejb/RMIClientNotificationListener.java
  
  Index: RMIClientNotificationListener.java
  ===================================================================
  /*
  * JBoss, the OpenSource J2EE webOS
  *
  * Distributable under LGPL license.
  * See terms of license at gnu.org.
  */
  package org.jboss.management.mejb;
  
  import java.io.Serializable;
  import java.rmi.Remote;
  import java.rmi.RemoteException;
  import java.rmi.server.UnicastRemoteObject;
  
  import javax.management.JMException;
  import javax.management.Notification;
  import javax.management.NotificationFilter;
  import javax.management.NotificationListener;
  import javax.management.ObjectName;
  
  import org.jboss.jmx.connector.RemoteMBeanServer;
  
  /**
  * Client-side RMI Listener to receive the message and send to the
  * clients listener. Its stub is used on the server-side to hand
  * the Notifications over to this class.
  *
  * @author <A href="mailto:[EMAIL PROTECTED]";>Andreas &quot;Mad&quot; Schaefer</A>
  **/
  public class RMIClientNotificationListener
     extends ClientNotificationListener
     implements RMIClientNotificationListenerInterface
  {
  
     public RMIClientNotificationListener(
        ObjectName pSender,
        NotificationListener pClientListener,
        Object pHandback,
        NotificationFilter pFilter,
        MEJB pConnector
     ) throws
        RemoteException,
        JMException
     {
        super( pSender, pClientListener, pHandback );
        // Export the RMI object to become a callback object
        UnicastRemoteObject.exportObject( this );
        // Register the listener as MBean on the remote JMX server
        createListener(
           pConnector,
           "org.jboss.management.mejb.RMINotificationListener",
           new Object[] { this },
           new String[] { RMIClientNotificationListenerInterface.class.getName() }
        );
        addNotificationListener( pConnector, pFilter );
     }
  
     /**
     * Handles the given notification by sending this to the remote
     * client listener
     *
     * @param pNotification            Notification to be send
     * @param pHandback               Handback object
     **/
     public void handleNotification(
        Notification pNotification,
        Object pHandback
     ) throws
        RemoteException
     {
        mClientListener.handleNotification(
           pNotification,
           mHandback
        );
     }
  }
  
  
  
  1.1                  
jboss-management/src/main/org/jboss/management/mejb/RMIClientNotificationListenerInterface.java
  
  Index: RMIClientNotificationListenerInterface.java
  ===================================================================
  /*
  * JBoss, the OpenSource J2EE webOS
  *
  * Distributable under LGPL license.
  * See terms of license at gnu.org.
  */
  package org.jboss.management.mejb;
  
  import java.io.Serializable;
  import java.rmi.Remote;
  import java.rmi.RemoteException;
  
  import javax.management.Notification;
  
  /**
  * This Interface defines the methods in the RMI Stub
  * transferred to the server-side.
  *
  * @author <A href="mailto:[EMAIL PROTECTED]";>Andreas &quot;Mad&quot; Schaefer</A>
  **/
  public interface RMIClientNotificationListenerInterface
        extends Remote, Serializable
  {
  
        // Constants -----------------------------------------------------
  
        // Static --------------------------------------------------------
  
        // Public --------------------------------------------------------
        /**
        * Handles the given notifcation event and passed it to the registered
        * listener
        *
        * @param pNotification                          NotificationEvent
        * @param pHandback                                      Handback object
        *
        * @throws RemoteException                       If a Remote Exception occurred
        */
        public void handleNotification(
                Notification pNotification,
                Object pHandback
        ) throws 
                RemoteException;
  }
  
  
  
  1.1                  
jboss-management/src/main/org/jboss/management/mejb/RMINotificationListener.java
  
  Index: RMINotificationListener.java
  ===================================================================
  /*
  * JBoss, the OpenSource J2EE webOS
  *
  * Distributable under LGPL license.
  * See terms of license at gnu.org.
  */
  package org.jboss.management.mejb;
  
  import java.io.Serializable;
  import java.rmi.Remote;
  import java.rmi.RemoteException;
  
  import javax.management.Notification;
  
  /**
  * Notification Listener Implementation registered as
  * MBean on the remote JMX Server and the added as
  * Notification Listener on the remote JMX Server.
  * Each notification received will be transfered to
  * the remote client using RMI Callback Objects.
  *
  * @author <A href="mailto:[EMAIL PROTECTED]";>Andreas &quot;Mad&quot; Schaefer</A>
  **/
  public class RMINotificationListener
     implements RMINotificationListenerMBean
  {
     // -------------------------------------------------------------------------
     // Members 
     // -------------------------------------------------------------------------  
  
     private RMIClientNotificationListenerInterface mClientListener;
  
     // -------------------------------------------------------------------------
     // Constructor
     // -------------------------------------------------------------------------
      
     /**
      * Creates the RMI Notification Listener MBean implemenation which
      * will be registered at the remote JMX Server as notificatin listener
      * and then send the notification over the provided RMI Notification
      * sender to the client
      *
      * @param pClientListener RMI-Stub used to transfer the Notification over
      *                        the wire.
      **/
     public RMINotificationListener( RMIClientNotificationListenerInterface 
pClientListener ) {
        System.out.println( "RMINotificationListener(), client listener: " + 
pClientListener );
        mClientListener = pClientListener;
     }
  
     // -------------------------------------------------------------------------
     // Public Methods
     // -------------------------------------------------------------------------
      
        /**
        * Handles the given notifcation event and passed it to the registered
        * RMI Notification Sender
        *
        * @param pNotification                          NotificationEvent
        * @param pHandback                                      Handback object
        */
        public void handleNotification(
                Notification pNotification,
                Object pHandback
        ) {
        try {
           System.out.println(
              "RMINotificationListener.handleNotification() " +
              ", notification: " + pNotification +
              ", handback: " + pHandback +
              ", client listener: " + mClientListener
           );
           mClientListener.handleNotification( pNotification, pHandback );
        }
        catch( RemoteException re ) {
           re.printStackTrace();
           Throwable lDetail = re.detail;
           lDetail.printStackTrace();
           throw new RuntimeException( re.getMessage() );
        }
     }
     
     /**
     * Test if this and the given Object are equal. This is true if the given
     * object both refer to the same local listener
     *
     * @param pTest                                             Other object to test 
if equal
     *
     * @return                                                  True if both are of 
same type and
     *                                                                  refer to the 
same local listener
     **/
     public boolean equals( Object pTest ) {
        if( pTest instanceof RMINotificationListener ) {
           return mClientListener.equals(
              ( (RMINotificationListener) pTest).mClientListener
           );
        }
        return false;
     }
     
     /**
     * @return                                                  Hashcode of the remote 
listener
     **/
     public int hashCode() {
        return mClientListener.hashCode();
     }
  }
  
  
  
  1.1                  
jboss-management/src/main/org/jboss/management/mejb/RMINotificationListenerMBean.java
  
  Index: RMINotificationListenerMBean.java
  ===================================================================
  /*
  * JBoss, the OpenSource J2EE webOS
  *
  * Distributable under LGPL license.
  * See terms of license at gnu.org.
  */
  package org.jboss.management.mejb;
  
  import javax.management.Notification;
  import javax.management.NotificationListener;
  
  /**
  * MBean Interface of a Notification Listener MBean
  * using RMI Callback Objects to send the notifications
  * back to the client.
  * <br>
  * This interface is only necessary because of the naming
  * conventions for standard MBeans.
  *
  * @author <A href="mailto:[EMAIL PROTECTED]";>Andreas &quot;Mad&quot; Schaefer</A>
  **/
  public interface RMINotificationListenerMBean
     extends ListenerMBean
  {
  
        // Constants -----------------------------------------------------
  
        // Static --------------------------------------------------------
  
        // Public --------------------------------------------------------
  
  }
  
  
  
  1.1                  
jboss-management/src/main/org/jboss/management/mejb/SearchClientNotificationListener.java
  
  Index: SearchClientNotificationListener.java
  ===================================================================
  /*
  * JBoss, the OpenSource J2EE webOS
  *
  * Distributable under LGPL license.
  * See terms of license at gnu.org.
  */
  package org.jboss.management.mejb;
  
  import java.io.Serializable;
  
  import javax.jms.JMSException;
  import javax.jms.Message;
  import javax.jms.MessageListener;
  import javax.jms.ObjectMessage;
  
  import javax.management.Notification;
  import javax.management.NotificationListener;
  import javax.management.ObjectName;
  
  import org.jboss.jmx.connector.RemoteMBeanServer;
  
  /**
  * Local Listener only to seach other Local Listeners
  **/
  public class SearchClientNotificationListener
     extends ClientNotificationListener
  {
  
     public SearchClientNotificationListener(
        ObjectName pSender,
        NotificationListener pClientListener
     ) {
        super( pSender, pClientListener, null );
     }
  
  }
  
  
  

_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-development

Reply via email to