package org.drugis.common.threading.activity;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.drugis.common.threading.Task;
/**
* A DecisionTransition chooses one of its target states based on a conditional.
*/
public class DecisionTransition implements Transition {
private final Task d_source;
private final Task d_ifTask;
private final Task d_elTask;
private final Condition d_condition;
/**
* Transition to ifTask if condition evaluates to true, and to elTask otherwise.
* @param source Prior state.
* @param ifTask Target if condition.evaluate() == true.
* @param elTask Target if condition.evaluate() == false.
* @param condition The condition to be evaluated.
*/
public DecisionTransition(Task source, Task ifTask, Task elTask, Condition condition) {
d_source = source;
d_ifTask = ifTask;
d_elTask = elTask;
d_condition = condition;
}
public List<Task> getSources() {
return Collections.singletonList(d_source);
}
public List<Task> getTargets() {
List<Task> l = new ArrayList<Task>();
l.add(d_ifTask);
l.add(d_elTask);
return l;
}
public boolean isReady() {
return d_source.isFinished();
}
public List<Task> transition() {
if (!isReady()) {
throw new RuntimeException("Not ready for transition.");
}
if (d_condition.evaluate()) {
return Collections.singletonList(d_ifTask);
} else {
return Collections.singletonList(d_elTask);
}
}
}