package org.limewire.rudp;
import java.lang.ref.WeakReference;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**<p>
* An abstract class that provides a timed task to be repeated and rescheduled
* as needed. You must implement {@link #doActualEvent(UDPConnectionProcessor)}
* to call an appropriate {@link UDPConnectionProcessor} method.
* </p>
* When done with the event, unregister it.
*/
public abstract class UDPTimerEvent implements Comparable<UDPTimerEvent> {
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<UDPConnectionProcessor> _udpCon;
/**
* Create a timer event with a default time.
*/
UDPTimerEvent(long eventTime, UDPConnectionProcessor conn) {
_eventTime = eventTime;
_udpCon= new WeakReference<UDPConnectionProcessor>(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 milliseconds.
*/
public long getEventTime() {
return _eventTime;
}
public final void handleEvent(){
UDPConnectionProcessor udpCon = _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(UDPTimerEvent x) {
long ret = x._eventTime - _eventTime;
if ( ret > 0l )
return 1;
else if ( ret < 0l )
return -1;
else
return 0;
}
@Override
public String toString() {
return getClass().getName() + " [eventTime=" + _eventTime + "]";
}
}