package brainslug.flow.execution.async;
import brainslug.flow.definition.Identifier;
import brainslug.util.Option;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class ArrayListTriggerStore implements AsyncTriggerStore {
List<AsyncTrigger> triggers = new CopyOnWriteArrayList<AsyncTrigger>();
@Override
public AsyncTrigger storeTrigger(AsyncTrigger asyncTrigger) {
if (triggers.contains(asyncTrigger)) {
return asyncTrigger.incrementVersion();
} else {
triggers.add(asyncTrigger);
return asyncTrigger;
}
}
@Override
public AsyncTrigger updateTrigger(AsyncTrigger asyncTrigger) {
if (triggers.contains(asyncTrigger)) {
return asyncTrigger.incrementVersion();
}
throw new IllegalArgumentException("trigger cant be updated because it does not exist: " + asyncTrigger);
}
@Override
public boolean removeTrigger(AsyncTrigger asyncTrigger) {
return triggers.remove(asyncTrigger);
}
@Override
public List<AsyncTrigger> getTriggers(AsyncTriggerQuery triggerQuery) {
Date dueDate = triggerQuery.getOverdueDate().orElse(new Date());
List<AsyncTrigger> overdueTriggers = getOverdueTriggers(dueDate);
return overdueTriggers.subList(0, (int) Math.min(triggerQuery.maxCount, overdueTriggers.size()));
}
protected List<AsyncTrigger> getOverdueTriggers(Date dueDate) {
List<AsyncTrigger> overdueTasks = new ArrayList<AsyncTrigger>();
for (AsyncTrigger task: triggers) {
if (dueDate.getTime() >= task.getDueDate()) {
overdueTasks.add(task);
}
}
return overdueTasks;
}
@Override
public Option<AsyncTrigger> getTrigger(Identifier taskNodeId, Identifier instanceId, Identifier definitionId) {
for (AsyncTrigger trigger: triggers) {
if (trigger.getNodeId().equals(taskNodeId) &&
trigger.getInstanceId().equals(instanceId) &&
trigger.getDefinitionId().equals(definitionId)) {
return Option.of(trigger);
}
}
return Option.empty();
}
}