All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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