in src/main/java/org/apache/sling/pipes/internal/PlumberImpl.java [383:449]
public ExecutionResult execute(ResourceResolver resolver, Pipe pipe, Map additionalBindings, OutputWriter writer, boolean save) {
checkPermissions(resolver, configuration.executionPermissionResource());
boolean success = false;
PipeMonitor monitor = null;
ExecutionResult result = null;
long start = System.currentTimeMillis();
try {
boolean readOnly = false;
if (additionalBindings != null){
pipe.getBindings().addBindings(additionalBindings);
readOnly = (Boolean)additionalBindings.getOrDefault(BasePipe.READ_ONLY, false);
}
if (! pipe.isDryRun() && readOnly && pipe.modifiesContent()) {
throw new IllegalArgumentException("This pipe modifies content, you should use a POST request");
}
log.debug("[{}] before execution hook is called", pipe);
pipe.before();
log.info("[{}] execution starts, save ({})", pipe, save);
Resource confResource = pipe.getResource();
writer.setPipe(pipe);
if (isRunning(confResource)){
throw new IllegalStateException("Pipe is already running");
}
monitor = monitoredPipes.get(confResource.getPath());
writeStatus(pipe, STATUS_STARTED, null);
resolver.commit();
if (monitor != null){
monitor.starts();
}
result = internalExecute(resolver, writer, pipe);
if (save && pipe.modifiesContent()) {
persist(resolver, pipe, result, null);
}
if (writer.autoClose()) {
writer.ends();
}
if (monitor != null){
monitor.ends();
monitor.setLastResult(result);
}
success = true;
return result;
} catch (PersistenceException e) {
throw new IllegalStateException("persistence error while executing pipe", e);
} catch (InterruptedException ie) {
log.error("execution interrupted", ie);
Thread.currentThread().interrupt();
} finally {
try {
writeStatus(pipe, STATUS_FINISHED, result);
resolver.commit();
} catch (PersistenceException e) {
log.error("unable to make final save", e);
}
long length = System.currentTimeMillis() - start;
String time = length < 1000 ? length + "ms" : (length / 1000) + "s";
log.info("[{}] done executing in {}.", pipe.getName(), time);
log.debug("[{}] after execution hook is called", pipe);
pipe.after();
if (!success && monitor != null){
monitor.failed();
}
}
//returning void result if we get there
return new ExecutionResult(writer);
}