/*
 * JBoss, the OpenSource J2EE webOS
 *
 * Distributable under LGPL license.
 * See terms of license at gnu.org.
 */
package org.jboss.mx.notification;

import javax.management.NotificationFilter;
import javax.management.NotificationListener;

/**
 * The default notification listener registration.
 * 
 * @see org.jboss.mx.notification.ListenerRegistry
 * @see org.jboss.mx.notification.ListenerRegistrationFactory
 * 
 * @author  <a href="mailto:Adrian.Brock@HappeningTimes.com">Adrian Brock</a>.
 * @version $Revision: 1.3 $
 */
public class DefaultListenerRegistration
   implements ListenerRegistration
{
   // Attributes ----------------------------------------------------

   /**
    * The notification listener
    */
   private NotificationListener listener;

   /**
    * The notification filter
    */
   private NotificationFilter filter;

   /**
    * The handback object
    */
   private Object handback;

   // Constructor ---------------------------------------------------

   /**
    * Create a listener registration
    *
    * @param listener the notification listener
    * @param filter the notification filter
    * @param handback the handback object
    */
   public DefaultListenerRegistration(NotificationListener listener,
                                      NotificationFilter filter,
                                      Object handback)
   {
      this.listener = listener;
      this.filter = filter;
      this.handback = handback;
   }

   // Public --------------------------------------------------------

   // ListenerRegistration Implementation ---------------------------

   public NotificationListener getListener()
   {
      return listener;
   }

   public NotificationFilter getFilter()
   {
      return filter;
   }

   public Object getHandback()
   {
      return handback;
   }

   public NotificationListener getRegisteredListener()
   {
      return listener;
   }

   public NotificationFilter getRegisteredFilter()
   {
      return filter;
   }

   public void removed()
   {
   }

   public boolean equals(Object obj)
   {
      if (obj == null || (obj instanceof ListenerRegistration) == false)
         return false;
      ListenerRegistration other = (ListenerRegistration) obj;

      if (getRegisteredListener().equals(other.getRegisteredListener()) == false)
         return false;

      NotificationFilter myFilter = getRegisteredFilter();
      NotificationFilter otherFilter = other.getRegisteredFilter();
      if (myFilter != null && myFilter.equals(otherFilter) == false)
         return false;
      else if (myFilter == null && otherFilter != null)
         return false;

      Object myHandback = getHandback();
      Object otherHandback = other.getHandback();
      if (myHandback != null && myHandback.equals(otherHandback) == false)
         return false;
      else if (myHandback == null && otherHandback != null)
         return false;

      return true;
   }

   public int hashCode()
   {
      int result = listener.hashCode();
      if (filter != null)
         result += filter.hashCode();
      if (handback != null)
         result += handback.hashCode();
      return result;
   }

   public String toString()
   {
      StringBuffer buffer = new StringBuffer(50);
      buffer.append(getClass()).append(":");
      buffer.append(" listener=").append(getRegisteredListener());
      buffer.append(" filter=")  .append(getRegisteredFilter());
      buffer.append(" handback=").append(getHandback());
      return buffer.toString();
   }
}
