package com.mozilla.grouperfish.batch.handlers;
import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.mozilla.grouperfish.base.Assert;
import com.mozilla.grouperfish.base.StreamTool;
import com.mozilla.grouperfish.batch.scheduling.Helpers;
import com.mozilla.grouperfish.batch.transforms.Transform;
import com.mozilla.grouperfish.batch.transforms.Transform.TransformResult;
import com.mozilla.grouperfish.batch.transforms.TransformProvider;
import com.mozilla.grouperfish.model.Fail;
import com.mozilla.grouperfish.model.Task;
import com.mozilla.grouperfish.model.TransformConfig;
import com.mozilla.grouperfish.services.api.FileSystem;
import com.mozilla.grouperfish.services.api.FileSystem.Denied;
import com.mozilla.grouperfish.services.api.FileSystem.NotFound;
/** Perform the actual running of the transform. */
public class RunHandler implements TaskHandler {
private static final Logger log = LoggerFactory.getLogger(RunHandler.class);
private final FileSystem fs;
private final TransformProvider transforms;
public RunHandler(final FileSystem fs, final TransformProvider transforms) {
this.fs = fs;
this.transforms = transforms;
}
@Override
public Task handle(final Task task) throws Fail {
final String inputDirectory;
try {
inputDirectory = fs.uri(Helpers.taskDirectory(task));
}
catch (final NotFound e) {
throw Fail.hard(task, "Task input not found...", e);
}
try {
fs.makeDirectory(Helpers.outputDirectory(task));
} catch (final Denied e) {
throw Fail.hard(task, "Cannot create output directory.", e);
}
final TransformConfig config = task.transform();
final Transform transform = transforms.get(config.transform());
Assert.nonNull(transform);
log.info(String.format("Launching transform '%s' with input directory '%s'", transform, inputDirectory));
try {
final TransformResult result = transform.run(task);
if (result.success()) {
log.info("Transform {} for task {} was run successfully.", transform, task);
}
else {
final String message = String.format("Failed to run transform: %s (task %s)", transform, task);
log.warn(message);
log.warn("STDERR: {}", StreamTool.consume(result.stderr(), StreamTool.UTF8));
throw Fail.hard(task, message, null);
}
}
catch (final InterruptedException e) {
throw Fail.soft(task, "Interrupted during run.", e);
}
catch (final IOException e) {
throw Fail.hard(task, "Received IO error reading from task STDERR", e);
}
return task;
}
}