in src/main/java/com/amazonaws/services/simpleworkflow/flow/worker/HistoryHelper.java [111:163]
private void fillNext() {
boolean decisionTaskTimedOut = false;
List<HistoryEvent> decisionStartToCompletionEvents = new ArrayList<HistoryEvent>();
List<HistoryEvent> decisionCompletionToStartEvents = new ArrayList<HistoryEvent>();
boolean concurrentToDecision = true;
int lastDecisionIndex = -1;
long nextReplayCurrentTimeMilliseconds = -1;
while (events.hasNext()) {
HistoryEvent event = events.next();
EventType eventType = EventType.fromValue(event.getEventType());
if (eventType == EventType.DecisionTaskCompleted) {
String executionContext = event.getDecisionTaskCompletedEventAttributes().getExecutionContext();
updateWorkflowContextDataAndComponentVersions(executionContext);
concurrentToDecision = false;
}
else if (eventType == EventType.DecisionTaskStarted) {
nextReplayCurrentTimeMilliseconds = event.getEventTimestamp().getTime();
if (decisionTaskTimedOut) {
current.getDecisionEvents().addAll(decisionStartToCompletionEvents);
decisionStartToCompletionEvents = new ArrayList<HistoryEvent>();
decisionTaskTimedOut = false;
}
else {
break;
}
}
else if (eventType.equals(EventType.DecisionTaskTimedOut)) {
decisionTaskTimedOut = true;
}
else if (eventType == EventType.DecisionTaskScheduled) {
// skip
}
else if (eventType == EventType.MarkerRecorded) {
// ignore
}
else if (eventType == EventType.RecordMarkerFailed) {
// ignore
}
else {
if (concurrentToDecision) {
decisionStartToCompletionEvents.add(event);
}
else {
if (isDecisionEvent(eventType)) {
lastDecisionIndex = decisionCompletionToStartEvents.size();
}
decisionCompletionToStartEvents.add(event);
}
}
}
List<HistoryEvent> nextEvents = reorderEvents(decisionStartToCompletionEvents, decisionCompletionToStartEvents, lastDecisionIndex);
next = new SingleDecisionData(nextEvents, nextReplayCurrentTimeMilliseconds, workflowContextData);
}