package org.yakindu.sct.generator.java.test;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import org.yakindu.scr.ITimer;
import org.yakindu.scr.ITimerCallback;
/**
* Default timer service implementation.
*
*/
public class CustomTimerService implements ITimer {
private final Timer timer = new Timer();
private final List<TimeEventTask> timerTaskList = new ArrayList<TimeEventTask>();
private final Lock lock = new ReentrantLock();
public List<Integer> timerCallbacks = new ArrayList<>();
/**
* Timer task that reflects a time event. It's internally used by
* {@link CustomTimerService}.
*
*/
private class TimeEventTask extends TimerTask {
private ITimerCallback callback;
int eventID;
/**
* Constructor for a time event.
*
* @param callback
* : Set to {@code true} if event should be repeated
* periodically.
*
* @param eventID
* : Index position within the state machine's timeEvent
* array.
*/
public TimeEventTask(ITimerCallback callback, int eventID) {
this.callback = callback;
this.eventID = eventID;
}
public void run() {
timerCallbacks.add(new Integer(eventID));
callback.timeElapsed(eventID);
}
public boolean equals(Object obj) {
if (obj instanceof TimeEventTask) {
return ((TimeEventTask) obj).callback.equals(callback) && ((TimeEventTask) obj).eventID == eventID;
}
return super.equals(obj);
}
}
public void setTimer(final ITimerCallback callback, final int eventID, long time, boolean isPeriodic) {
// Create a new TimerTask for given event and store it.
TimeEventTask timerTask = new TimeEventTask(callback, eventID);
lock.lock();
timerTaskList.add(timerTask);
// start scheduling the timer
if (isPeriodic) {
timer.scheduleAtFixedRate(timerTask, time, time);
} else {
timer.schedule(timerTask, time);
}
lock.unlock();
}
public void unsetTimer(ITimerCallback callback, int eventID) {
lock.lock();
int index = timerTaskList.indexOf(new TimeEventTask(callback, eventID));
if (index != -1) {
timerTaskList.get(index).cancel();
timer.purge();
timerTaskList.remove(index);
}
lock.unlock();
}
public int getTimerCallbackCount(int eventID) {
int i = 0;
for (Integer event : timerCallbacks) {
if (event.intValue() == eventID)
i++;
}
return i;
}
/**
* Cancel timer service. Use this to end possible timing threads and free
* memory resources.
*/
public void cancel() {
lock.lock();
timer.cancel();
timer.purge();
lock.unlock();
}
}