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

brainslug.flow.context.AbstractBrainslugContextBuilder Maven / Gradle / Ivy

The newest version!
package brainslug.flow.context;

import brainslug.flow.definition.DefinitionStore;
import brainslug.flow.definition.HashMapDefinitionStore;
import brainslug.flow.execution.*;
import brainslug.flow.execution.async.*;
import brainslug.flow.execution.expression.DefaultExpressionEvaluator;
import brainslug.flow.execution.expression.ExpressionEvaluator;
import brainslug.flow.execution.instance.HashMapInstanceStore;
import brainslug.flow.execution.instance.InstanceStore;
import brainslug.flow.execution.node.task.CallDefinitionExecutor;
import brainslug.flow.execution.node.task.ScriptExecutor;
import brainslug.flow.execution.property.store.HashMapPropertyStore;
import brainslug.flow.execution.property.store.PropertyStore;
import brainslug.flow.execution.token.HashMapTokenStore;
import brainslug.flow.execution.token.TokenFlowExecutor;
import brainslug.flow.execution.token.TokenStore;
import brainslug.flow.listener.DefaultListenerManager;
import brainslug.flow.listener.ListenerManager;
import brainslug.util.IdGenerator;
import brainslug.util.UuidGenerator;

import javax.script.ScriptEngineManager;
import java.util.ServiceLoader;

public abstract class AbstractBrainslugContextBuilder {

  protected AsyncTriggerExecutor asyncTriggerExecutor = new AsyncTriggerExecutor();
  protected AsyncTriggerSchedulerOptions asyncTriggerSchedulerOptions = new AsyncTriggerSchedulerOptions();

  protected AsyncFlowStartScheduler asyncFlowStartScheduler = new ExecutorServiceFlowStartScheduler();
  protected SchedulerOptions asyncFlowStartSchedulerOptions = new SchedulerOptions();

  protected DefinitionStore definitionStore = new HashMapDefinitionStore();
  protected ListenerManager listenerManager = new DefaultListenerManager();
  protected CallDefinitionExecutor callDefinitionExecutor = new CallDefinitionExecutor();
  protected ScriptExecutor scriptExecutor = new ScriptExecutor(new ScriptEngineManager());
  protected ExpressionEvaluator expressionEvaluator = createExpressionEvaluator();

  protected Registry registry = new HashMapRegistry();

  protected IdGenerator idGenerator;
  protected FlowExecutor flowExecutor;
  protected TokenStore tokenStore;
  protected InstanceStore instanceStore;
  protected AsyncTriggerStore asyncTriggerStore;
  protected PropertyStore propertyStore;
  protected AsyncTriggerScheduler asyncTriggerScheduler;

  public T build() {
    if (idGenerator == null) {
      withIdGenerator(new UuidGenerator());
    }

    if (asyncTriggerStore == null) {
      withAsyncTriggerStore(new ArrayListTriggerStore());
    }

    if (propertyStore == null) {
      withPropertyStore(new HashMapPropertyStore());
    }

    if (tokenStore == null) {
      withTokenStore(new HashMapTokenStore(idGenerator));
    }

    if (instanceStore == null) {
      withInstanceStore(new HashMapInstanceStore(idGenerator, propertyStore, tokenStore));
    }

    if (asyncTriggerScheduler == null) {
      withAsyncTriggerScheduler(new ExecutorServiceAsyncTriggerScheduler()
        .withAsyncTriggerExecutor(asyncTriggerExecutor)
      );
    }

    if (flowExecutor == null) {
      withFlowExecutor(new TokenFlowExecutor(
        tokenStore,
        instanceStore,
        definitionStore,
        propertyStore,
        listenerManager,
        registry,
        expressionEvaluator,
        asyncTriggerStore,
        asyncTriggerScheduler,
        callDefinitionExecutor,
        scriptExecutor
      ));
    }

    return internalBuild();
  }

  protected abstract T internalBuild();

  public SelfType self() {
    return (SelfType) this;
  }

  public SelfType withAsyncTriggerScheduler(AsyncTriggerScheduler asyncTriggerScheduler) {
    this.asyncTriggerScheduler = asyncTriggerScheduler;
    return self();
  }

  public SelfType withAsyncTriggerSchedulerOptions(AsyncTriggerSchedulerOptions asyncTriggerSchedulerOptions) {
    this.asyncTriggerSchedulerOptions = asyncTriggerSchedulerOptions;
    return self();
  }

  public SelfType withAsyncTriggerStore(AsyncTriggerStore asyncTriggerStore) {
    this.asyncTriggerStore = asyncTriggerStore;
    return self();
  }

  public SelfType withAsyncFlowStartScheduler(AsyncFlowStartScheduler asyncFlowStartScheduler) {
    this.asyncFlowStartScheduler = asyncFlowStartScheduler;
    return self();
  }

  public SelfType withAsyncFlowStartSchedulerOptions(SchedulerOptions asyncFlowStartSchedulerOptions) {
    this.asyncFlowStartSchedulerOptions = asyncFlowStartSchedulerOptions;
    return self();
  }

  public SelfType withPropertyStore(PropertyStore propertyStore) {
    this.propertyStore = propertyStore;
    return self();
  }

  public SelfType withDefinitionStore(DefinitionStore definitionStore) {
    this.definitionStore = definitionStore;
    return self();
  }

  public SelfType withTokenStore(TokenStore tokenStore) {
    this.tokenStore = tokenStore;
    return self();
  }

  public SelfType withFlowExecutor(FlowExecutor newFlowExecutor) {
    this.flowExecutor = newFlowExecutor;
    return self();
  }

  public SelfType withAsyncTriggerExecutor(AsyncTriggerExecutor asyncTriggerExecutor) {
    this.asyncTriggerExecutor = asyncTriggerExecutor;
    return self();
  }

  public SelfType withInstanceStore(InstanceStore instanceStore) {
    this.instanceStore = instanceStore;
    return self();
  }

  public SelfType withListenerManager(ListenerManager listenerManager) {
    this.listenerManager = listenerManager;
    return self();
  }

  public SelfType withRegistry(Registry registry) {
    this.registry = registry;
    return self();
  }

  public SelfType withPredicateEvaluator(ExpressionEvaluator expressionEvaluator) {
    this.expressionEvaluator = expressionEvaluator;
    return self();
  }

  public SelfType withIdGenerator(IdGenerator idGenerator) {
    this.idGenerator = idGenerator;
    return self();
  }

  public SelfType withCallDefinitionExecutor(CallDefinitionExecutor callDefinitionExecutor) {
    this.callDefinitionExecutor = callDefinitionExecutor;
    return self();
  }

  public SelfType withScriptExecutor(ScriptExecutor scriptExecutor) {
    this.scriptExecutor = scriptExecutor;
    return self();
  }

  protected ExpressionEvaluator createExpressionEvaluator() {
    ServiceLoader evaluatorLoader = ServiceLoader.load(ExpressionEvaluator.class);
    if (evaluatorLoader.iterator().hasNext()) {
      return evaluatorLoader.iterator().next();
    }
    return new DefaultExpressionEvaluator();
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy