package com.google.code.gossip;

import java.util.Date;

import javax.management.NotificationListener;
import javax.management.timer.Timer;

/**
 * This object represents a timer for a gossip member. When the timer has elapsed without being
 * reset in the meantime, it will inform the GossipService about this who in turn will put the
 * gossip member on the dead list, because it is apparantly not alive anymore.
 *
 * @author joshclemm, harmenw
 */
public class GossipTimeoutTimer extends Timer {

  private final long _sleepTime;
  private final LocalGossipMember _source;

  /**
   * Constructor. Creates a reset-able timer that wakes up after millisecondsSleepTime.
   *
   * @param millisecondsSleepTime
   *          The time for this timer to wait before an event.
   * @param notificationListener
   * @param member
   */
  public GossipTimeoutTimer(long millisecondsSleepTime, NotificationListener notificationListener,
          LocalGossipMember member) {
    super();
    _sleepTime = millisecondsSleepTime;
    _source = member;
    addNotificationListener(notificationListener, null, null);
  }

  /**
   * @see javax.management.timer.Timer#start()
   */
  public void start() {
    this.reset();
    super.start();
  }

  /**
   * Resets timer to start counting down from original time.
   */
  public void reset() {
    removeAllNotifications();
    setWakeupTime(_sleepTime);
  }

  /**
   * Adds a new wake-up time for this timer.
   *
   * @param milliseconds
   */
  private void setWakeupTime(long milliseconds) {
    addNotification("type", "message", _source, new Date(System.currentTimeMillis() + milliseconds));
  }
}
