package org.smoothbuild.task.base; import static com.google.common.base.Preconditions.checkState; import org.smoothbuild.db.hashed.Hash; import org.smoothbuild.lang.message.CodeLocation; import org.smoothbuild.lang.type.Type; import org.smoothbuild.task.exec.ContainerImpl; import com.google.common.collect.ImmutableList; import com.google.common.hash.HashCode; import com.google.common.hash.Hasher; public class Task { private final Computer computer; private final ImmutableList<Task> dependencies; private Output output; public Task(Computer computer, ImmutableList<Task> dependencies) { this.computer = computer; this.dependencies = dependencies; this.output = null; } public Computer computer() { return computer; } public ImmutableList<Task> dependencies() { return dependencies; } public String name() { return computer.name(); } public Type resultType() { return computer.resultType(); } public boolean isInternal() { return computer.isInternal(); } public boolean isCacheable() { return computer.isCacheable(); } public CodeLocation codeLocation() { return computer.codeLocation(); } public void execute(ContainerImpl container) { output = computer.execute(input(), container); } public Output output() { checkState(output != null); return output; } public void setOutput(Output output) { this.output = output; } public boolean hasOutput() { return output != null; } public HashCode hash() { Hasher hasher = Hash.newHasher(); hasher.putBytes(computer.hash().asBytes()); hasher.putBytes(input().hash().asBytes()); return hasher.hash(); } private Input input() { return Input.fromResults(dependencies); } }