From 7989677ec59903af31337dccdfe4b691b7492730 Mon Sep 17 00:00:00 2001 From: geirolz Date: Mon, 12 Feb 2024 23:49:34 +0100 Subject: [PATCH] Preserve java configuration when provided --- .../main/scala-2/fly4s/data/Fly4sConfig.scala | 4 +++- .../main/scala-3/fly4s/data/Fly4sConfig.scala | 5 +++-- core/src/main/scala/fly4s/Fly4s.scala | 4 ++-- .../scala/fly4s/data/Fly4sConfigBuilder.scala | 20 +++++++++++++++++-- 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/core/src/main/scala-2/fly4s/data/Fly4sConfig.scala b/core/src/main/scala-2/fly4s/data/Fly4sConfig.scala index cd47f2a..bb667ad 100644 --- a/core/src/main/scala-2/fly4s/data/Fly4sConfig.scala +++ b/core/src/main/scala-2/fly4s/data/Fly4sConfig.scala @@ -3,6 +3,7 @@ package fly4s.data import cats.data.NonEmptyList import com.geirolz.macros.fluent.copy.FluentCopy import fly4s.data.Fly4sConfigDefaults.* +import org.flywaydb.core.api.configuration.Configuration import java.nio.charset.Charset @@ -51,6 +52,7 @@ case class Fly4sConfig( skipDefaultCallbacks: Boolean = defaultSkipDefaultCallbacks, skipDefaultResolvers: Boolean = defaultSkipDefaultResolvers, // --- mima after 1.0.0 --- - loggers: List[LoggerType] = defaultLoggers + loggers: List[LoggerType] = defaultLoggers, + baseJavaConfig: Option[Configuration] = None ) extends Fly4sConfigContract object Fly4sConfig extends Fly4sConfigBuilder diff --git a/core/src/main/scala-3/fly4s/data/Fly4sConfig.scala b/core/src/main/scala-3/fly4s/data/Fly4sConfig.scala index 8298b28..da832e6 100644 --- a/core/src/main/scala-3/fly4s/data/Fly4sConfig.scala +++ b/core/src/main/scala-3/fly4s/data/Fly4sConfig.scala @@ -2,7 +2,7 @@ package fly4s.data import cats.data.NonEmptyList import fly4s.data.Fly4sConfigDefaults.* -import fly4s.data.* +import org.flywaydb.core.api.configuration.Configuration import java.nio.charset.Charset @@ -50,7 +50,8 @@ case class Fly4sConfig( skipDefaultCallbacks: Boolean = defaultSkipDefaultCallbacks, skipDefaultResolvers: Boolean = defaultSkipDefaultResolvers, // --- mima after 1.0.0 --- - loggers: List[LoggerType] = defaultLoggers + loggers: List[LoggerType] = defaultLoggers, + baseJavaConfig: Option[Configuration] = None ) extends Fly4sConfigContract object Fly4sConfig extends Fly4sConfigBuilder: diff --git a/core/src/main/scala/fly4s/Fly4s.scala b/core/src/main/scala/fly4s/Fly4s.scala index 4014a8e..046e3bd 100644 --- a/core/src/main/scala/fly4s/Fly4s.scala +++ b/core/src/main/scala/fly4s/Fly4s.scala @@ -203,7 +203,7 @@ object Fly4s extends AllInstances { )(implicit F: Async[F]): Resource[F, Fly4s[F]] = { val acquireFly4s = for { - c1 <- Fly4sConfig.toJava(config, classLoader).liftTo[F] + c1 <- Fly4sConfig.toJavaF[F](config, classLoader) c2 <- F.delay(Flyway.configure(classLoader).configuration(c1)) fly4s <- fromJavaConfig[F](mapFlywayConfig(c2)) } yield fly4s @@ -242,7 +242,7 @@ object Fly4s extends AllInstances { for { currentJConfig <- F.pure(flyway.getConfiguration) classLoader = currentJConfig.getClassLoader - c <- Fly4sConfig.toJava(newConfig, classLoader).liftTo[F] + c <- Fly4sConfig.toJavaF[F](newConfig, classLoader) jConfig <- F.delay { val newJConfig = new FluentConfiguration(classLoader) diff --git a/core/src/main/scala/fly4s/data/Fly4sConfigBuilder.scala b/core/src/main/scala/fly4s/data/Fly4sConfigBuilder.scala index ca3d760..545c2d7 100644 --- a/core/src/main/scala/fly4s/data/Fly4sConfigBuilder.scala +++ b/core/src/main/scala/fly4s/data/Fly4sConfigBuilder.scala @@ -1,5 +1,6 @@ package fly4s.data +import cats.MonadThrow import cats.data.NonEmptyList import org.flywaydb.core.api.configuration.{Configuration, FluentConfiguration} @@ -8,6 +9,7 @@ import scala.jdk.CollectionConverters.{MapHasAsJava, MapHasAsScala} import scala.util.Try private[fly4s] trait Fly4sConfigContract { + val baseJavaConfig: Option[Configuration] val connectRetries: Int val initSql: Option[String] val defaultSchemaName: Option[String] @@ -115,6 +117,7 @@ private[fly4s] trait Fly4sConfigBuilder { def fromJava(c: Configuration): Fly4sConfig = new Fly4sConfig( + baseJavaConfig = Some(c), // ---------- connection ---------- connectRetries = c.getConnectRetries, initSql = Option(c.getInitSql), @@ -161,12 +164,25 @@ private[fly4s] trait Fly4sConfigBuilder { skipDefaultResolvers = c.isSkipDefaultResolvers ) + @deprecated("Use toJavaF[Try] instead, this will be removed in the future versions.", "1.0.1") def toJava( c: Fly4sConfig, classLoader: ClassLoader = Thread.currentThread.getContextClassLoader - ): Try[Configuration] = Try { + ): Try[Configuration] = toJavaF[Try](c, classLoader) + + // TODO Remove this method in the future to `toJava` + def toJavaF[F[_]: MonadThrow]( + c: Fly4sConfig, + classLoader: ClassLoader = Thread.currentThread.getContextClassLoader + ): F[Configuration] = MonadThrow[F].catchNonFatal { + + val fluentConfiguration: FluentConfiguration = c.baseJavaConfig match { + case Some(jconf) => new FluentConfiguration(classLoader).configuration(jconf) + case None => new FluentConfiguration(classLoader) + } + // ---------- connection ---------- - new FluentConfiguration(classLoader) + fluentConfiguration .connectRetries(c.connectRetries) .initSql(c.initSql.orNull) .defaultSchema(c.defaultSchemaName.orNull)