package org.smoothbuild.task.exec; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import org.smoothbuild.db.values.ValuesDb; import org.smoothbuild.lang.expr.Expression; import org.smoothbuild.lang.value.Value; import org.smoothbuild.task.base.Task; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList.Builder; public class TaskGraph { private final TaskExecutor taskExecutor; private final ValuesDb valuesDb; private final List<Task> rootTasks; @Inject public TaskGraph(TaskExecutor taskExecutor, ValuesDb valuesDb) { this.taskExecutor = taskExecutor; this.valuesDb = valuesDb; this.rootTasks = new ArrayList<>(); } public <T extends Value> Task createTasks(Expression expression) { Task root = createTasksImpl(expression); rootTasks.add(root); return root; } private <T extends Value> Task createTasksImpl(Expression expression) { ImmutableList<Task> dependencies = createTasksImpl(expression.dependencies()); return new Task(expression.createComputer(valuesDb), dependencies); } private ImmutableList<Task> createTasksImpl(ImmutableList<? extends Expression> expressions) { Builder<Task> builder = ImmutableList.builder(); for (Expression expression : expressions) { Task executor = createTasksImpl(expression); builder.add(executor); } return builder.build(); } public void executeAll() { for (Task task : rootTasks) { executeGraph(task); } } private void executeGraph(Task task) { for (Task subTask : task.dependencies()) { executeGraph(subTask); } taskExecutor.execute(task); } }