
com.codepoetics.fluvius.flows.BranchFlow Maven / Gradle / Ivy
package com.codepoetics.fluvius.flows;
import com.codepoetics.fluvius.api.Condition;
import com.codepoetics.fluvius.api.Conditional;
import com.codepoetics.fluvius.api.Flow;
import com.codepoetics.fluvius.api.FlowVisitor;
import com.codepoetics.fluvius.api.scratchpad.Key;
import com.codepoetics.fluvius.exceptions.IllegalBranchOutputKeyException;
import com.codepoetics.fluvius.preconditions.Preconditions;
import java.util.*;
final class BranchFlow extends AbstractFlow {
private static final class ConditionalFlow {
private final Condition condition;
private final Flow ifTrue;
private ConditionalFlow(Condition condition, Flow ifTrue) {
this.condition = condition;
this.ifTrue = ifTrue;
}
public Condition getCondition() {
return condition;
}
public Flow getIfTrue() {
return ifTrue;
}
Conditional toConditional(FlowVisitor visitor) {
return Conditional.of(visitor.visitCondition(condition), ifTrue.visit(visitor));
}
}
static Flow create(Flow defaultFlow, Condition condition, Flow ifTrue) {
Preconditions.checkNotNull("defaultFlow", defaultFlow);
Preconditions.checkNotNull("condition", condition);
Preconditions.checkNotNull("ifTrue", ifTrue);
List> branches = new ArrayList<>(1);
branches.add(new ConditionalFlow<>(condition, ifTrue));
return create(defaultFlow, branches);
}
private static Flow create(Flow defaultFlow, List> branches) {
Key defaultOutputKey = defaultFlow.getProvidedKey();
Set> requiredKeys = defaultFlow.getRequiredKeys();
for (ConditionalFlow conditionalFlow : branches) {
Key conditionalOutputKey = conditionalFlow.getIfTrue().getProvidedKey();
if (!conditionalOutputKey.equals(defaultOutputKey)) {
throw IllegalBranchOutputKeyException.create(
defaultOutputKey,
conditionalFlow.getCondition().getDescription(),
conditionalOutputKey);
}
requiredKeys.addAll(conditionalFlow.getIfTrue().getRequiredKeys());
}
return new BranchFlow<>(UUID.randomUUID(), requiredKeys, defaultOutputKey, defaultFlow, branches);
}
private final Flow defaultFlow;
private final List> branches;
private BranchFlow(UUID stepId, Set> inputKeys, Key outputKey, Flow defaultFlow, List> branches) {
super(stepId, inputKeys, outputKey);
this.defaultFlow = defaultFlow;
this.branches = branches;
}
@Override
public V visit(FlowVisitor visitor) {
List> branchActions = new ArrayList<>(branches.size());
for (ConditionalFlow conditionalFlow : branches) {
branchActions.add(
conditionalFlow.toConditional(visitor));
}
return visitor.visitBranch(getStepId(), getRequiredKeys(), getProvidedKey(), defaultFlow.visit(visitor), branchActions);
}
@Override
public Flow orIf(Condition condition, Flow ifTrue) {
List> branches = new ArrayList<>(this.branches);
branches.add(new ConditionalFlow<>(condition, ifTrue));
return create(defaultFlow, branches);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy