package com.limegroup.gnutella.udpconnect; import java.lang.ref.WeakReference; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * A timed task to be repeated and rescheduled as needed. */ public abstract class UDPTimerEvent implements Comparable { private static final Log LOG = LogFactory.getLog(UDPTimerEvent.class); /** The currently scheduled time. */ protected volatile long _eventTime; private volatile boolean _shouldUnregister; /** the UDPConnectionProcessor this event refers to */ protected final WeakReference _udpCon; /** * Create a timer event with a default time. */ UDPTimerEvent(long eventTime, UDPConnectionProcessor conn) { _eventTime = eventTime; _udpCon= new WeakReference(conn); } /** * checks whether the UDPConnectionProcessor has been finalized and if so, * unregisters this event from the given scheduler * Also checks if this is event wants to unregister itself * @return whether the UDPConnectionProcessor was unregistered. */ final boolean shouldUnregister() { if (_udpCon.get() == null || _shouldUnregister) { LOG.debug("Event decided to unregister itself"); return true; } return false; } protected final void unregister() { _shouldUnregister=true; _eventTime=1; } /** * Change the time that an event is scheduled at. Note to recall scheduler. */ public void updateTime(long updatedEventTime) { if (!_shouldUnregister) _eventTime = updatedEventTime; } /** * Return the time that an event should take place in millis. */ public long getEventTime() { return _eventTime; } public final void handleEvent(){ UDPConnectionProcessor udpCon = (UDPConnectionProcessor) _udpCon.get(); if (udpCon==null) return; doActualEvent(udpCon); } /** * Implementors should take their event actions here. */ protected abstract void doActualEvent(UDPConnectionProcessor proc); /** * Compares event times */ public int compareTo(Object x) { long ret = ((UDPTimerEvent)x)._eventTime - _eventTime; if ( ret > 0l ) return 1; else if ( ret < 0l ) return -1; else return 0; } }