}
public void execute(TaskInternal task, TaskStateInternal state, TaskExecutionContext context) {
LOGGER.debug("Determining if {} is up-to-date", task);
Clock clock = new Clock();
TaskArtifactState taskArtifactState = repository.getStateFor(task);
try {
List<String> messages = new ArrayList<String>();
if (taskArtifactState.isUpToDate(messages)) {
LOGGER.info("Skipping {} as it is up-to-date (took {}).", task, clock.getTime());
state.upToDate();
return;
}
logOutOfDateMessages(messages, task, clock.getTime());
task.getOutputs().setHistory(taskArtifactState.getExecutionHistory());
context.setTaskArtifactState(taskArtifactState);
taskArtifactState.beforeTask();
try {
executer.execute(task, state, context);
if (state.getFailure() == null) {
taskArtifactState.afterTask();
}
} finally {
task.getOutputs().setHistory(null);
context.setTaskArtifactState(null);
}
} finally {
taskArtifactState.finished();
}
}