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

com.ing.baker.runtime.inmemory.InMemoryBaker.scala Maven / Gradle / Ivy

The newest version!
package com.ing.baker.runtime.inmemory

import cats.effect.{ConcurrentEffect, ContextShift, IO, Timer}
import cats.~>
import com.ing.baker.runtime.javadsl.BakerConfig
import com.ing.baker.runtime.model.{BakerComponents, BakerF, InteractionInstance}
import com.ing.baker.runtime.{defaultinteractions, javadsl}

import java.util
import java.util.{List => JavaList}
import scala.annotation.nowarn
import scala.collection.JavaConverters._
import scala.concurrent._

object InMemoryBaker {

  def build(config: BakerF.Config = BakerF.Config(),
            implementations: List[InteractionInstance[IO]])(implicit timer: Timer[IO], cs: ContextShift[IO]): IO[BakerF[IO]] = for {
    recipeInstanceManager <- InMemoryRecipeInstanceManager.build(config.idleTimeout, config.retentionPeriodCheckInterval)
    recipeManager <- InMemoryRecipeManager.build
    eventStream <- InMemoryEventStream.build
    interactions <- InMemoryInteractionManager.build(implementations ++ defaultinteractions.all)
  } yield buildWith(BakerComponents[IO](interactions, recipeInstanceManager, recipeManager, eventStream), config)

  def buildWith(components: BakerComponents[IO],
                config: BakerF.Config = BakerF.Config())(implicit timer: Timer[IO], cs: ContextShift[IO]): BakerF[IO] = {
    implicit val c: BakerComponents[IO] = components
    new InMemoryBakerImpl(config)
  }

  @nowarn
  def java(config: BakerF.Config, implementations: JavaList[AnyRef]): javadsl.Baker = {
    implicit val timer: Timer[IO] = IO.timer(ExecutionContext.global)
    implicit val contextShift: ContextShift[IO] = IO.contextShift(ExecutionContext.global)
    val interactions = implementations.asScala.map{
      case it: InteractionInstance[IO] => it
      case it: com.ing.baker.runtime.javadsl.InteractionInstance =>
        it.asScala.translate[IO](new (Future ~> IO) {
          def apply[A](fa: Future[A]): IO[A] = IO.fromFuture(IO(fa))
        })
      case it => InteractionInstance.unsafeFrom[IO](it)
    }
    val bakerF = build(config, interactions.toList)
      .unsafeRunSync().asDeprecatedFutureImplementation(
      new (IO ~> Future) {
        def apply[A](fa: IO[A]): Future[A] = fa.unsafeToFuture()
      },
      new (Future ~> IO) {
        def apply[A](fa: Future[A]): IO[A] = IO.fromFuture(IO(fa))
      }
    )
    new javadsl.Baker(bakerF)
  }

  def java(config: BakerConfig, implementations: JavaList[AnyRef]): javadsl.Baker = {
    java(config.toBakerFConfig(), implementations)
  }

  def java(implementations: JavaList[AnyRef]): javadsl.Baker = {
    java(BakerF.Config(), implementations)
  }

  def java(): javadsl.Baker = {
    java(BakerF.Config(), new util.ArrayList[AnyRef]())
  }
}

final class InMemoryBakerImpl(val config: BakerF.Config)(implicit components: BakerComponents[IO], effect: ConcurrentEffect[IO], timer: Timer[IO]) extends BakerF[IO] {

  /**
    * Attempts to gracefully shutdown the baker system.
    */
  override def gracefulShutdown(): IO[Unit] = IO.unit
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy