package core.aws.plan; import core.aws.resource.Resource; import core.aws.util.Asserts; import core.aws.workflow.Task; import core.aws.workflow.Tasks; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; import static core.aws.util.StreamHelper.instanceOf; import static core.aws.util.StreamHelper.onlyOne; /** * @author neo */ public abstract class Planner { protected final Tasks tasks; public Planner(Tasks tasks) { this.tasks = tasks; } public <T extends Resource, U extends Task> Optional<U> find(final Class<U> taskClass, final T resource) { Asserts.notNull(resource, "resource can not be null"); return tasks.stream().flatMap(instanceOf(taskClass)).filter(task -> task.resource == resource).reduce(onlyOne()); } public <U extends Task> Optional<U> find(Class<U> taskClass) { return tasks.stream().flatMap(instanceOf(taskClass)).reduce(onlyOne()); } public <T extends Task> List<T> all(Class<T> taskClass) { return tasks.stream().flatMap(instanceOf(taskClass)).collect(Collectors.toList()); } public abstract void plan(); }