/*
 * JBoss, Home of Professional Open Source
 *
 * Distributable under LGPL license.
 * See terms of license at gnu.org.
 */
package org.jboss.test.jmx.listener;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.management.Notification;

import org.jboss.system.ListenerServiceMBeanSupport;

/**
 * A test service that subscribes and stores JMX Notifications.
 * 
 * The subscription are specified declaratively using the
 * ListenerServiceMBean SubscriptionList attribute.
 * 
 * @author <a href="mailto:dimitris@jboss.org">Dimitris Andreadis</a>
 * @version $Revision: 1.1.2.1 $
 */
public class NotificationListener extends ListenerServiceMBeanSupport
   implements NotificationListenerMBean
{
   // Private Data --------------------------------------------------
   
  /** Stored notifications */
  private List notifList;
  
  // Constructors --------------------------------------------------
  
  /**
   * CTOR
  **/
  public NotificationListener()
  {
     notifList = Collections.synchronizedList(new ArrayList());
  }
  
  // NotificationListenerMBean implementation -----------------------
  
   /**
    * Number of notifications received.
    */
   public int getNotificationCount()
   {
      return notifList.size();
   }
   
   /**
    * @return a list of Notifications received
    */
   public List retrieveNotifications()
   {
      return new ArrayList(notifList);
   }

   /**
    * Clear the stored notifications, reset the counter
    */
   public void clearNotifications()
   {
      notifList.clear();
   }
   
   // Lifecycle -----------------------------------------------------
   
   protected void startService() throws Exception
   {
      clearNotifications();
      super.subscribe(false);
   }
   
   protected void stopService()
   {
      super.unsubscribe();
      clearNotifications();
   }
   
   // ListenerServiceMBeanSupport -----------------------------------
   
   public void handleNotification2(Notification notification, Object handback)
   {
      notifList.add(notification);
      log.debug("Received notification #" + notifList.size() + ": " + notification);
   }
}
