Attempt.java
package com.github.dakusui.actionunit.actions;
import com.github.dakusui.actionunit.core.Action;
import com.github.dakusui.actionunit.core.ActionSupport;
import com.github.dakusui.actionunit.core.Context;
import com.github.dakusui.actionunit.exceptions.ActionException;
import java.util.Formatter;
import java.util.function.Consumer;
import static com.github.dakusui.actionunit.core.ActionSupport.leaf;
import static com.github.dakusui.actionunit.core.ActionSupport.named;
import static java.util.Objects.requireNonNull;
public interface Attempt extends Action {
@Override
default void accept(Visitor visitor) {
visitor.visit(this);
}
Action perform();
Action recover();
Action ensure();
Class<? extends Throwable> targetExceptionClass();
@Override
default void formatTo(Formatter formatter, int flags, int width, int precision) {
formatter.format("attempt");
}
class Builder extends Action.Builder<Attempt> {
private Class<? extends Throwable> targetExceptionClass = Exception.class;
private final Action perform;
private Action recover = Named.of("recover",
Leaf.of(
(Context $) -> {
if ($.wasExceptionThrown()) {
throw ActionException.wrap($.thrownException());
}
}));
private Action ensure = Named.of("ensure",
ActionSupport.nop()
);
public Builder(Action perform) {
this.perform = requireNonNull(perform);
}
public Builder recover(Class<? extends Throwable> targetExceptionClass, Consumer<Throwable> exceptionHandler) {
this.recover = Named.of("recover", leaf(c -> {
exceptionHandler.accept(c.thrownException());
}));
this.targetExceptionClass = requireNonNull(targetExceptionClass);
return this;
}
public Builder recover(Class<? extends Throwable> targetExceptionClass, Action recover) {
this.recover = Named.of("recover", requireNonNull(recover));
this.targetExceptionClass = requireNonNull(targetExceptionClass);
return this;
}
public Action ensure(Action ensure) {
this.ensure = named("ensure", requireNonNull(ensure));
return this.$();
}
public Attempt build() {
return new Attempt() {
@Override
public Action perform() {
return perform;
}
@Override
public Action recover() {
return recover;
}
public Class<? extends Throwable> targetExceptionClass() {
return targetExceptionClass;
}
@Override
public Action ensure() {
return ensure;
}
};
}
}
}