diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 76434d45..1b803500 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,7 +1,7 @@ name: Publish on: push: - branches: [master] + branches: [master, support/*] jobs: publish: runs-on: ubuntu-latest diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6b65ae58..988b140e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -18,7 +18,7 @@ jobs: - name: Stop docker run: docker compose -f docker-compose.test.yml down - name: Run sample application test - run: ./gradlew :sample:test + run: ./gradlew :thoth-sample:test - name: Publish Unit Test Results uses: EnricoMi/publish-unit-test-result-action@v1 if: always() diff --git a/build.gradle b/build.gradle index 8d22311f..5a52ad27 100644 --- a/build.gradle +++ b/build.gradle @@ -28,20 +28,24 @@ subprojects { } ext { + lombokVersion = "1.18.44" scalaVersion = "2.13" - alpakkaKafkaVersion = "2.0.7" - jacksonVersion = "2.18.4" - akkaVersion = "2.6.14" - vavrVersion = "0.10.6" - vavrJacksonVersion = "0.10.3" - jooqVersion = "3.20.4" - jooqAsyncVersion = "2.4.0-rc1" - functionalJsonVersion = "1.0.5-rc1" - kafkaVersion = "3.0.1" + pekkoKafkaVersion = "1.1.0" + jacksonVersion = "3.1.0" + pekkoVersion = "1.4.0" + vavrVersion = "1.0.1" + vavrJacksonVersion = "1.0.0" + jooqVersion = "3.21.1" + jooqAsyncVersion = "3.0.0-RC1" + functionalJsonVersion = "2.0.0-RC1" + kafkaVersion = "3.9.2" reactorKafkaVersion = "1.3.23" - reactorVersion = "3.7.7" - vertxSqlVersion = "5.0.0" + reactorVersion = "3.8.4" + vertxSqlVersion = "5.0.10" testContainerVersion = "1.21.1" + jupiterVersion = "6.0.3" + assertJVersion = "3.27.7" + mockitoCoreVersion = "5.18.0" } test { diff --git a/settings.gradle b/settings.gradle index 599595ae..863a6636 100644 --- a/settings.gradle +++ b/settings.gradle @@ -8,18 +8,18 @@ */ rootProject.name = 'thoth' -include 'commons-events' +include 'thoth-commons-events' include 'thoth-core' include 'thoth-jooq' -include 'thoth-core-akka' -include 'thoth-jooq-akka' -include 'thoth-kafka-consumer-akka' +include 'thoth-core-pekko' +include 'thoth-jooq-pekko' +include 'thoth-kafka-consumer-pekko' include 'thoth-core-reactor' include 'thoth-jooq-reactor' include 'thoth-kafka-consumer-reactor' include 'thoth-tck' -include 'sample' -include 'demo:demo-in-memory' -include 'demo:demo-in-memory-vanilla' -include 'demo:demo-postgres-kafka' -include 'demo:demo-postgres-kafka-reactive' \ No newline at end of file +include 'thoth-sample' +include 'thoth-demo:demo-in-memory' +include 'thoth-demo:demo-in-memory-vanilla' +include 'thoth-demo:demo-postgres-kafka' +include 'thoth-demo:demo-postgres-kafka-reactive' \ No newline at end of file diff --git a/commons-events/build.gradle b/thoth-commons-events/build.gradle similarity index 100% rename from commons-events/build.gradle rename to thoth-commons-events/build.gradle diff --git a/commons-events/readme.md b/thoth-commons-events/readme.md similarity index 100% rename from commons-events/readme.md rename to thoth-commons-events/readme.md diff --git a/commons-events/src/main/java/fr/maif/eventsourcing/Event.java b/thoth-commons-events/src/main/java/fr/maif/eventsourcing/Event.java similarity index 100% rename from commons-events/src/main/java/fr/maif/eventsourcing/Event.java rename to thoth-commons-events/src/main/java/fr/maif/eventsourcing/Event.java diff --git a/commons-events/src/main/java/fr/maif/eventsourcing/EventEnvelope.java b/thoth-commons-events/src/main/java/fr/maif/eventsourcing/EventEnvelope.java similarity index 100% rename from commons-events/src/main/java/fr/maif/eventsourcing/EventEnvelope.java rename to thoth-commons-events/src/main/java/fr/maif/eventsourcing/EventEnvelope.java diff --git a/commons-events/src/main/java/fr/maif/eventsourcing/Lazy.java b/thoth-commons-events/src/main/java/fr/maif/eventsourcing/Lazy.java similarity index 100% rename from commons-events/src/main/java/fr/maif/eventsourcing/Lazy.java rename to thoth-commons-events/src/main/java/fr/maif/eventsourcing/Lazy.java diff --git a/commons-events/src/main/java/fr/maif/eventsourcing/Result.java b/thoth-commons-events/src/main/java/fr/maif/eventsourcing/Result.java similarity index 100% rename from commons-events/src/main/java/fr/maif/eventsourcing/Result.java rename to thoth-commons-events/src/main/java/fr/maif/eventsourcing/Result.java diff --git a/commons-events/src/main/java/fr/maif/eventsourcing/Type.java b/thoth-commons-events/src/main/java/fr/maif/eventsourcing/Type.java similarity index 100% rename from commons-events/src/main/java/fr/maif/eventsourcing/Type.java rename to thoth-commons-events/src/main/java/fr/maif/eventsourcing/Type.java diff --git a/commons-events/src/main/java/fr/maif/eventsourcing/Unit.java b/thoth-commons-events/src/main/java/fr/maif/eventsourcing/Unit.java similarity index 100% rename from commons-events/src/main/java/fr/maif/eventsourcing/Unit.java rename to thoth-commons-events/src/main/java/fr/maif/eventsourcing/Unit.java diff --git a/thoth-core-akka/build.gradle b/thoth-core-akka/build.gradle deleted file mode 100644 index 48eafb71..00000000 --- a/thoth-core-akka/build.gradle +++ /dev/null @@ -1,33 +0,0 @@ - -dependencies { - implementation project(':commons-events') - implementation project(':thoth-core') - implementation project(':thoth-kafka-consumer-akka') - implementation("io.vavr:vavr:$vavrVersion") - implementation("io.vavr:vavr-jackson:$vavrJacksonVersion") - implementation("com.typesafe.akka:akka-stream_$scalaVersion:$akkaVersion") - implementation("com.typesafe.akka:akka-stream-kafka_$scalaVersion:$alpakkaKafkaVersion") - implementation 'org.scala-lang:scala-library:2.13.8' - implementation("com.fasterxml.uuid:java-uuid-generator:3.1.5") - implementation("com.fasterxml.jackson.datatype:jackson-datatype-jdk8:$jacksonVersion") - implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jacksonVersion") - implementation("fr.maif:functional-json:$functionalJsonVersion") - - testImplementation("com.typesafe.akka:akka-testkit_$scalaVersion:$akkaVersion") - testImplementation("com.typesafe.akka:akka-stream-testkit_$scalaVersion:$akkaVersion") - testImplementation("com.typesafe.akka:akka-stream-kafka-testkit_$scalaVersion:$alpakkaKafkaVersion") - testImplementation("org.assertj:assertj-core:3.10.0") - testImplementation("com.h2database:h2:1.4.197") - testImplementation("org.mockito:mockito-core:2.22.0") - testImplementation("org.junit.platform:junit-platform-launcher:1.4.2") - testImplementation("org.junit.platform:junit-platform-commons:1.4.2") - testImplementation("org.junit.jupiter:junit-jupiter-engine:5.4.2") - testImplementation("org.junit.vintage:junit-vintage-engine:5.4.2") - testImplementation("net.aichler:jupiter-interface:0.9.1") - testImplementation("org.scalatest:scalatest_$scalaVersion:3.0.8") - testImplementation("org.testcontainers:kafka:1.15.3") -} - -test { - useJUnitPlatform() -} \ No newline at end of file diff --git a/thoth-core-pekko/build.gradle b/thoth-core-pekko/build.gradle new file mode 100644 index 00000000..a5b4c992 --- /dev/null +++ b/thoth-core-pekko/build.gradle @@ -0,0 +1,34 @@ + +dependencies { + implementation project(':thoth-commons-events') + implementation project(':thoth-core') + implementation project(':thoth-kafka-consumer-pekko') + implementation("io.vavr:vavr:$vavrVersion") + implementation("io.vavr:vavr-jackson:$vavrJacksonVersion") + + implementation "org.apache.pekko:pekko-actor_$scalaVersion:$pekkoVersion" + implementation "org.apache.pekko:pekko-stream_$scalaVersion:$pekkoVersion" + implementation "org.apache.pekko:pekko-slf4j_$scalaVersion:$pekkoVersion" + implementation "org.apache.pekko:pekko-connectors-kafka_$scalaVersion:$pekkoKafkaVersion" + + implementation 'org.scala-lang:scala-library:2.13.8' + implementation("com.fasterxml.uuid:java-uuid-generator:3.1.5") + implementation("tools.jackson.core:jackson-databind:$jacksonVersion") + implementation("fr.maif:functional-json:$functionalJsonVersion") + + testImplementation("org.testcontainers:kafka:$testContainerVersion") + testImplementation("org.testcontainers:junit-jupiter:$testContainerVersion") + testImplementation "org.apache.pekko:pekko-testkit_$scalaVersion:$pekkoVersion" + testImplementation("org.apache.pekko:pekko-stream-testkit_$scalaVersion:$pekkoVersion") + testImplementation "org.apache.pekko:pekko-connectors-kafka-testkit_$scalaVersion:$pekkoKafkaVersion" + testImplementation("org.assertj:assertj-core:$assertJVersion") + testImplementation('com.h2database:h2:2.2.220') + testImplementation("org.mockito:mockito-core:$mockitoCoreVersion") + testImplementation(platform("org.junit:junit-bom:$jupiterVersion")) + testImplementation("org.junit.jupiter:junit-jupiter") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") +} + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/thoth-core-akka/src/main/java/fr/maif/akka/AkkaExecutionContext.java b/thoth-core-pekko/src/main/java/fr/maif/akka/AkkaExecutionContext.java similarity index 98% rename from thoth-core-akka/src/main/java/fr/maif/akka/AkkaExecutionContext.java rename to thoth-core-pekko/src/main/java/fr/maif/akka/AkkaExecutionContext.java index 84c7e928..696e28c1 100644 --- a/thoth-core-akka/src/main/java/fr/maif/akka/AkkaExecutionContext.java +++ b/thoth-core-pekko/src/main/java/fr/maif/akka/AkkaExecutionContext.java @@ -1,6 +1,6 @@ package fr.maif.akka; -import akka.actor.ActorSystem; +import org.apache.pekko.actor.ActorSystem; import scala.concurrent.ExecutionContext; import scala.concurrent.ExecutionContextExecutorService; diff --git a/thoth-core-akka/src/main/java/fr/maif/akka/concurrent/ExecutionContextBridge.scala b/thoth-core-pekko/src/main/java/fr/maif/akka/concurrent/ExecutionContextBridge.scala similarity index 100% rename from thoth-core-akka/src/main/java/fr/maif/akka/concurrent/ExecutionContextBridge.scala rename to thoth-core-pekko/src/main/java/fr/maif/akka/concurrent/ExecutionContextBridge.scala diff --git a/thoth-core-akka/src/main/java/fr/maif/akka/config/Configs.java b/thoth-core-pekko/src/main/java/fr/maif/akka/config/Configs.java similarity index 100% rename from thoth-core-akka/src/main/java/fr/maif/akka/config/Configs.java rename to thoth-core-pekko/src/main/java/fr/maif/akka/config/Configs.java diff --git a/thoth-core-akka/src/main/java/fr/maif/akka/eventsourcing/DefaultAggregateStore.java b/thoth-core-pekko/src/main/java/fr/maif/akka/eventsourcing/DefaultAggregateStore.java similarity index 91% rename from thoth-core-akka/src/main/java/fr/maif/akka/eventsourcing/DefaultAggregateStore.java rename to thoth-core-pekko/src/main/java/fr/maif/akka/eventsourcing/DefaultAggregateStore.java index 109765ce..4988c42f 100644 --- a/thoth-core-akka/src/main/java/fr/maif/akka/eventsourcing/DefaultAggregateStore.java +++ b/thoth-core-pekko/src/main/java/fr/maif/akka/eventsourcing/DefaultAggregateStore.java @@ -1,8 +1,8 @@ package fr.maif.akka.eventsourcing; -import akka.actor.ActorSystem; -import akka.stream.Materializer; -import akka.stream.javadsl.Source; +import org.apache.pekko.actor.ActorSystem; +import org.apache.pekko.stream.Materializer; +import org.apache.pekko.stream.javadsl.Source; import fr.maif.eventsourcing.*; import fr.maif.eventsourcing.impl.AbstractDefaultAggregateStore; import org.reactivestreams.Publisher; diff --git a/thoth-core-akka/src/main/java/fr/maif/akka/eventsourcing/InMemoryEventStore.java b/thoth-core-pekko/src/main/java/fr/maif/akka/eventsourcing/InMemoryEventStore.java similarity index 96% rename from thoth-core-akka/src/main/java/fr/maif/akka/eventsourcing/InMemoryEventStore.java rename to thoth-core-pekko/src/main/java/fr/maif/akka/eventsourcing/InMemoryEventStore.java index 4345d762..1ce8ee1c 100644 --- a/thoth-core-akka/src/main/java/fr/maif/akka/eventsourcing/InMemoryEventStore.java +++ b/thoth-core-pekko/src/main/java/fr/maif/akka/eventsourcing/InMemoryEventStore.java @@ -1,11 +1,11 @@ package fr.maif.akka.eventsourcing; -import akka.NotUsed; -import akka.actor.ActorSystem; -import akka.japi.Pair; -import akka.stream.Materializer; -import akka.stream.OverflowStrategy; -import akka.stream.javadsl.*; +import org.apache.pekko.NotUsed; +import org.apache.pekko.actor.ActorSystem; +import org.apache.pekko.japi.Pair; +import org.apache.pekko.stream.Materializer; +import org.apache.pekko.stream.OverflowStrategy; +import org.apache.pekko.stream.javadsl.*; import fr.maif.concurrent.CompletionStages; import fr.maif.eventsourcing.Event; import fr.maif.eventsourcing.EventEnvelope; diff --git a/thoth-core-akka/src/main/java/fr/maif/akka/eventsourcing/KafkaEventPublisher.java b/thoth-core-pekko/src/main/java/fr/maif/akka/eventsourcing/KafkaEventPublisher.java similarity index 95% rename from thoth-core-akka/src/main/java/fr/maif/akka/eventsourcing/KafkaEventPublisher.java rename to thoth-core-pekko/src/main/java/fr/maif/akka/eventsourcing/KafkaEventPublisher.java index f603e244..2156c829 100644 --- a/thoth-core-akka/src/main/java/fr/maif/akka/eventsourcing/KafkaEventPublisher.java +++ b/thoth-core-pekko/src/main/java/fr/maif/akka/eventsourcing/KafkaEventPublisher.java @@ -1,17 +1,17 @@ package fr.maif.akka.eventsourcing; -import akka.NotUsed; -import akka.actor.ActorSystem; -import akka.japi.Pair; -import akka.kafka.ProducerMessage; -import akka.kafka.ProducerSettings; -import akka.kafka.javadsl.Producer; -import akka.stream.KillSwitches; -import akka.stream.Materializer; -import akka.stream.OverflowStrategy; -import akka.stream.RestartSettings; -import akka.stream.UniqueKillSwitch; -import akka.stream.javadsl.*; +import org.apache.pekko.NotUsed; +import org.apache.pekko.actor.ActorSystem; +import org.apache.pekko.japi.Pair; +import org.apache.pekko.kafka.ProducerMessage; +import org.apache.pekko.kafka.ProducerSettings; +import org.apache.pekko.kafka.javadsl.Producer; +import org.apache.pekko.stream.KillSwitches; +import org.apache.pekko.stream.Materializer; +import org.apache.pekko.stream.OverflowStrategy; +import org.apache.pekko.stream.RestartSettings; +import org.apache.pekko.stream.UniqueKillSwitch; +import org.apache.pekko.stream.javadsl.*; import fr.maif.eventsourcing.EventStore.ConcurrentReplayStrategy; import fr.maif.eventsourcing.Event; import fr.maif.eventsourcing.EventEnvelope; diff --git a/thoth-core-akka/src/main/java/fr/maif/akka/jdbc/Convertions.java b/thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/Convertions.java similarity index 97% rename from thoth-core-akka/src/main/java/fr/maif/akka/jdbc/Convertions.java rename to thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/Convertions.java index 0ad66150..8fe13dd5 100755 --- a/thoth-core-akka/src/main/java/fr/maif/akka/jdbc/Convertions.java +++ b/thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/Convertions.java @@ -1,8 +1,8 @@ package fr.maif.akka.jdbc; -import akka.japi.Pair; -import akka.japi.tuple.Tuple3; -import akka.japi.tuple.Tuple4; +import org.apache.pekko.japi.Pair; +import org.apache.pekko.japi.tuple.Tuple3; +import org.apache.pekko.japi.tuple.Tuple4; import fr.maif.akka.jdbc.function.ResultSetExtractor; import java.math.BigDecimal; diff --git a/thoth-core-akka/src/main/java/fr/maif/akka/jdbc/JdbcExecutionContext.java b/thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/JdbcExecutionContext.java similarity index 89% rename from thoth-core-akka/src/main/java/fr/maif/akka/jdbc/JdbcExecutionContext.java rename to thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/JdbcExecutionContext.java index 830623d9..16a3e560 100644 --- a/thoth-core-akka/src/main/java/fr/maif/akka/jdbc/JdbcExecutionContext.java +++ b/thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/JdbcExecutionContext.java @@ -1,6 +1,6 @@ package fr.maif.akka.jdbc; -import akka.actor.ActorSystem; +import org.apache.pekko.actor.ActorSystem; import fr.maif.akka.AkkaExecutionContext; public class JdbcExecutionContext extends AkkaExecutionContext { diff --git a/thoth-core-akka/src/main/java/fr/maif/akka/jdbc/Sql.java b/thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/Sql.java similarity index 95% rename from thoth-core-akka/src/main/java/fr/maif/akka/jdbc/Sql.java rename to thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/Sql.java index c097960c..e7cd52b9 100755 --- a/thoth-core-akka/src/main/java/fr/maif/akka/jdbc/Sql.java +++ b/thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/Sql.java @@ -1,9 +1,9 @@ package fr.maif.akka.jdbc; -import akka.Done; -import akka.NotUsed; -import akka.actor.ActorSystem; -import akka.stream.javadsl.Source; +import org.apache.pekko.Done; +import org.apache.pekko.NotUsed; +import org.apache.pekko.actor.ActorSystem; +import org.apache.pekko.stream.javadsl.Source; import fr.maif.akka.jdbc.query.SqlContext; import fr.maif.akka.jdbc.function.ResultSetExtractor; import fr.maif.akka.jdbc.query.SelectQueryBuilder; diff --git a/thoth-core-akka/src/main/java/fr/maif/akka/jdbc/exceptions/ExceptionsHandler.java b/thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/exceptions/ExceptionsHandler.java similarity index 83% rename from thoth-core-akka/src/main/java/fr/maif/akka/jdbc/exceptions/ExceptionsHandler.java rename to thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/exceptions/ExceptionsHandler.java index 297e5b78..2400c377 100755 --- a/thoth-core-akka/src/main/java/fr/maif/akka/jdbc/exceptions/ExceptionsHandler.java +++ b/thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/exceptions/ExceptionsHandler.java @@ -1,7 +1,7 @@ package fr.maif.akka.jdbc.exceptions; -import akka.japi.function.Creator; -import akka.japi.function.Effect; +import org.apache.pekko.japi.function.Creator; +import org.apache.pekko.japi.function.Effect; /** * Created by adelegue on 29/04/2016. diff --git a/thoth-core-akka/src/main/java/fr/maif/akka/jdbc/exceptions/SqlException.java b/thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/exceptions/SqlException.java similarity index 100% rename from thoth-core-akka/src/main/java/fr/maif/akka/jdbc/exceptions/SqlException.java rename to thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/exceptions/SqlException.java diff --git a/thoth-core-akka/src/main/java/fr/maif/akka/jdbc/function/ResultSetExtractor.java b/thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/function/ResultSetExtractor.java similarity index 100% rename from thoth-core-akka/src/main/java/fr/maif/akka/jdbc/function/ResultSetExtractor.java rename to thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/function/ResultSetExtractor.java diff --git a/thoth-core-akka/src/main/java/fr/maif/akka/jdbc/query/Query.java b/thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/query/Query.java similarity index 100% rename from thoth-core-akka/src/main/java/fr/maif/akka/jdbc/query/Query.java rename to thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/query/Query.java diff --git a/thoth-core-akka/src/main/java/fr/maif/akka/jdbc/query/SelectQueryBuilder.java b/thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/query/SelectQueryBuilder.java similarity index 96% rename from thoth-core-akka/src/main/java/fr/maif/akka/jdbc/query/SelectQueryBuilder.java rename to thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/query/SelectQueryBuilder.java index 4fe12f81..8ea0427a 100755 --- a/thoth-core-akka/src/main/java/fr/maif/akka/jdbc/query/SelectQueryBuilder.java +++ b/thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/query/SelectQueryBuilder.java @@ -1,10 +1,10 @@ package fr.maif.akka.jdbc.query; -import akka.NotUsed; -import akka.stream.ActorAttributes; -import akka.stream.Attributes; -import akka.stream.javadsl.Flow; -import akka.stream.javadsl.Source; +import org.apache.pekko.NotUsed; +import org.apache.pekko.stream.ActorAttributes; +import org.apache.pekko.stream.Attributes; +import org.apache.pekko.stream.javadsl.Flow; +import org.apache.pekko.stream.javadsl.Source; import fr.maif.akka.jdbc.function.ResultSetExtractor; import fr.maif.akka.jdbc.stream.source.SelectQuerySource; diff --git a/thoth-core-akka/src/main/java/fr/maif/akka/jdbc/query/SqlContext.java b/thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/query/SqlContext.java similarity index 89% rename from thoth-core-akka/src/main/java/fr/maif/akka/jdbc/query/SqlContext.java rename to thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/query/SqlContext.java index 776e6963..3da94ae5 100755 --- a/thoth-core-akka/src/main/java/fr/maif/akka/jdbc/query/SqlContext.java +++ b/thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/query/SqlContext.java @@ -1,6 +1,6 @@ package fr.maif.akka.jdbc.query; -import akka.actor.ActorSystem; +import org.apache.pekko.actor.ActorSystem; import java.sql.Connection; diff --git a/thoth-core-akka/src/main/java/fr/maif/akka/jdbc/query/UpdateQueryBuilder.java b/thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/query/UpdateQueryBuilder.java similarity index 95% rename from thoth-core-akka/src/main/java/fr/maif/akka/jdbc/query/UpdateQueryBuilder.java rename to thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/query/UpdateQueryBuilder.java index a0b06059..4c1b0f55 100755 --- a/thoth-core-akka/src/main/java/fr/maif/akka/jdbc/query/UpdateQueryBuilder.java +++ b/thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/query/UpdateQueryBuilder.java @@ -1,10 +1,10 @@ package fr.maif.akka.jdbc.query; -import akka.NotUsed; -import akka.stream.ActorAttributes; -import akka.stream.Attributes; -import akka.stream.javadsl.Flow; -import akka.stream.javadsl.Source; +import org.apache.pekko.NotUsed; +import org.apache.pekko.stream.ActorAttributes; +import org.apache.pekko.stream.Attributes; +import org.apache.pekko.stream.javadsl.Flow; +import org.apache.pekko.stream.javadsl.Source; import fr.maif.akka.jdbc.stream.source.UpdateQuerySource; import fr.maif.akka.jdbc.stream.source.UpdateQueryWithResultedIdSource; diff --git a/thoth-core-akka/src/main/java/fr/maif/akka/jdbc/stream/ResourcesHelper.java b/thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/stream/ResourcesHelper.java similarity index 100% rename from thoth-core-akka/src/main/java/fr/maif/akka/jdbc/stream/ResourcesHelper.java rename to thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/stream/ResourcesHelper.java diff --git a/thoth-core-akka/src/main/java/fr/maif/akka/jdbc/stream/source/SelectQuerySource.java b/thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/stream/source/SelectQuerySource.java similarity index 89% rename from thoth-core-akka/src/main/java/fr/maif/akka/jdbc/stream/source/SelectQuerySource.java rename to thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/stream/source/SelectQuerySource.java index ae1a27c5..592d7c28 100755 --- a/thoth-core-akka/src/main/java/fr/maif/akka/jdbc/stream/source/SelectQuerySource.java +++ b/thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/stream/source/SelectQuerySource.java @@ -1,13 +1,13 @@ package fr.maif.akka.jdbc.stream.source; -import akka.event.Logging; -import akka.event.LoggingAdapter; -import akka.stream.Attributes; -import akka.stream.Outlet; -import akka.stream.SourceShape; -import akka.stream.stage.AbstractOutHandler; -import akka.stream.stage.GraphStage; -import akka.stream.stage.GraphStageLogic; +import org.apache.pekko.event.Logging; +import org.apache.pekko.event.LoggingAdapter; +import org.apache.pekko.stream.Attributes; +import org.apache.pekko.stream.Outlet; +import org.apache.pekko.stream.SourceShape; +import org.apache.pekko.stream.stage.AbstractOutHandler; +import org.apache.pekko.stream.stage.GraphStage; +import org.apache.pekko.stream.stage.GraphStageLogic; import fr.maif.akka.jdbc.function.ResultSetExtractor; import fr.maif.akka.jdbc.query.Query; import fr.maif.akka.jdbc.query.SqlContext; diff --git a/thoth-core-akka/src/main/java/fr/maif/akka/jdbc/stream/source/UpdateQuerySource.java b/thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/stream/source/UpdateQuerySource.java similarity index 88% rename from thoth-core-akka/src/main/java/fr/maif/akka/jdbc/stream/source/UpdateQuerySource.java rename to thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/stream/source/UpdateQuerySource.java index 227439f7..54d67601 100755 --- a/thoth-core-akka/src/main/java/fr/maif/akka/jdbc/stream/source/UpdateQuerySource.java +++ b/thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/stream/source/UpdateQuerySource.java @@ -1,13 +1,13 @@ package fr.maif.akka.jdbc.stream.source; -import akka.event.Logging; -import akka.event.LoggingAdapter; -import akka.stream.Attributes; -import akka.stream.Outlet; -import akka.stream.SourceShape; -import akka.stream.stage.AbstractOutHandler; -import akka.stream.stage.GraphStage; -import akka.stream.stage.GraphStageLogic; +import org.apache.pekko.event.Logging; +import org.apache.pekko.event.LoggingAdapter; +import org.apache.pekko.stream.Attributes; +import org.apache.pekko.stream.Outlet; +import org.apache.pekko.stream.SourceShape; +import org.apache.pekko.stream.stage.AbstractOutHandler; +import org.apache.pekko.stream.stage.GraphStage; +import org.apache.pekko.stream.stage.GraphStageLogic; import fr.maif.akka.jdbc.query.Query; import fr.maif.akka.jdbc.query.SqlContext; import fr.maif.akka.jdbc.stream.ResourcesHelper; diff --git a/thoth-core-akka/src/main/java/fr/maif/akka/jdbc/stream/source/UpdateQueryWithResultedIdSource.java b/thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/stream/source/UpdateQueryWithResultedIdSource.java similarity index 89% rename from thoth-core-akka/src/main/java/fr/maif/akka/jdbc/stream/source/UpdateQueryWithResultedIdSource.java rename to thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/stream/source/UpdateQueryWithResultedIdSource.java index bfc1bf3f..e35cb1e5 100755 --- a/thoth-core-akka/src/main/java/fr/maif/akka/jdbc/stream/source/UpdateQueryWithResultedIdSource.java +++ b/thoth-core-pekko/src/main/java/fr/maif/akka/jdbc/stream/source/UpdateQueryWithResultedIdSource.java @@ -1,13 +1,13 @@ package fr.maif.akka.jdbc.stream.source; -import akka.event.Logging; -import akka.event.LoggingAdapter; -import akka.stream.Attributes; -import akka.stream.Outlet; -import akka.stream.SourceShape; -import akka.stream.stage.AbstractOutHandler; -import akka.stream.stage.GraphStage; -import akka.stream.stage.GraphStageLogic; +import org.apache.pekko.event.Logging; +import org.apache.pekko.event.LoggingAdapter; +import org.apache.pekko.stream.Attributes; +import org.apache.pekko.stream.Outlet; +import org.apache.pekko.stream.SourceShape; +import org.apache.pekko.stream.stage.AbstractOutHandler; +import org.apache.pekko.stream.stage.GraphStage; +import org.apache.pekko.stream.stage.GraphStageLogic; import fr.maif.akka.jdbc.query.Query; import fr.maif.akka.jdbc.query.SqlContext; import fr.maif.akka.jdbc.stream.ResourcesHelper; diff --git a/thoth-core-akka/src/main/java/fr/maif/akka/kafka/KafkaSettings.java b/thoth-core-pekko/src/main/java/fr/maif/akka/kafka/KafkaSettings.java similarity index 98% rename from thoth-core-akka/src/main/java/fr/maif/akka/kafka/KafkaSettings.java rename to thoth-core-pekko/src/main/java/fr/maif/akka/kafka/KafkaSettings.java index 55645b96..dc0c7daa 100644 --- a/thoth-core-akka/src/main/java/fr/maif/akka/kafka/KafkaSettings.java +++ b/thoth-core-pekko/src/main/java/fr/maif/akka/kafka/KafkaSettings.java @@ -1,8 +1,8 @@ package fr.maif.akka.kafka; -import akka.actor.ActorSystem; -import akka.kafka.ConsumerSettings; -import akka.kafka.ProducerSettings; +import org.apache.pekko.actor.ActorSystem; +import org.apache.pekko.kafka.ConsumerSettings; +import org.apache.pekko.kafka.ProducerSettings; import com.typesafe.config.Config; import fr.maif.akka.config.Configs; import io.vavr.Tuple; diff --git a/thoth-core-akka/src/main/java/fr/maif/akka/projections/EventuallyConsistentProjection.java b/thoth-core-pekko/src/main/java/fr/maif/akka/projections/EventuallyConsistentProjection.java similarity index 97% rename from thoth-core-akka/src/main/java/fr/maif/akka/projections/EventuallyConsistentProjection.java rename to thoth-core-pekko/src/main/java/fr/maif/akka/projections/EventuallyConsistentProjection.java index c245bf11..c53e9c32 100644 --- a/thoth-core-akka/src/main/java/fr/maif/akka/projections/EventuallyConsistentProjection.java +++ b/thoth-core-pekko/src/main/java/fr/maif/akka/projections/EventuallyConsistentProjection.java @@ -1,12 +1,12 @@ package fr.maif.akka.projections; -import akka.NotUsed; -import akka.actor.ActorSystem; -import akka.kafka.ConsumerMessage; -import akka.kafka.ConsumerSettings; -import akka.kafka.Subscriptions; -import akka.stream.javadsl.Flow; -import akka.stream.scaladsl.Source; +import org.apache.pekko.NotUsed; +import org.apache.pekko.actor.ActorSystem; +import org.apache.pekko.kafka.ConsumerMessage; +import org.apache.pekko.kafka.ConsumerSettings; +import org.apache.pekko.kafka.Subscriptions; +import org.apache.pekko.stream.javadsl.Flow; +import org.apache.pekko.stream.scaladsl.Source; import fr.maif.eventsourcing.Event; import fr.maif.eventsourcing.EventEnvelope; import fr.maif.eventsourcing.format.JacksonEventFormat; diff --git a/thoth-core-akka/src/test/java/fr/maif/Helpers.java b/thoth-core-pekko/src/test/java/fr/maif/Helpers.java similarity index 99% rename from thoth-core-akka/src/test/java/fr/maif/Helpers.java rename to thoth-core-pekko/src/test/java/fr/maif/Helpers.java index 169cb846..e641c52d 100644 --- a/thoth-core-akka/src/test/java/fr/maif/Helpers.java +++ b/thoth-core-pekko/src/test/java/fr/maif/Helpers.java @@ -1,6 +1,6 @@ package fr.maif; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import fr.maif.concurrent.CompletionStages; import fr.maif.eventsourcing.Command; import fr.maif.eventsourcing.CommandHandler; diff --git a/thoth-core-pekko/src/test/java/fr/maif/KafkaContainerTest.java b/thoth-core-pekko/src/test/java/fr/maif/KafkaContainerTest.java new file mode 100644 index 00000000..5c341656 --- /dev/null +++ b/thoth-core-pekko/src/test/java/fr/maif/KafkaContainerTest.java @@ -0,0 +1,106 @@ +package fr.maif; + +import org.apache.kafka.clients.admin.Admin; +import org.apache.kafka.clients.admin.AdminClientConfig; +import org.apache.kafka.clients.admin.CreateTopicsResult; +import org.apache.kafka.clients.admin.NewTopic; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerConfig; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.apache.kafka.common.serialization.StringSerializer; +import org.apache.pekko.actor.ActorSystem; +import org.apache.pekko.kafka.ConsumerSettings; +import org.testcontainers.containers.KafkaContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.utility.DockerImageName; + +import java.util.Map; +import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.concurrent.atomic.AtomicInteger; + +import static io.vavr.API.println; +import static org.apache.kafka.clients.consumer.ConsumerConfig.AUTO_OFFSET_RESET_CONFIG; + +@Testcontainers +public interface KafkaContainerTest { + + AtomicInteger counter = new AtomicInteger(0); + + @Container + KafkaContainer kafkaContainer = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:7.4.0")) + .withStartupAttempts(2); + + static void startContainer() { + kafkaContainer.start(); + } + + default String bootstrapServers() { + return kafkaContainer.getBootstrapServers(); + } + + default Admin adminClient() { + return Admin.create(Map.of( + AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaContainer.getBootstrapServers() + )); + } + + default String createTopic() { + return createTopic("topic-"+counter.incrementAndGet(), 3, 1); + } + + default String createTopic(String name, int partitions, int replication) { + try { + CreateTopicsResult createTopicsResult = adminClient().createTopics(java.util.List.of(new NewTopic(name, partitions, (short) replication))); + createTopicsResult.all().get(10, TimeUnit.SECONDS); + } catch (InterruptedException | ExecutionException | TimeoutException e) { + throw new RuntimeException("Unable to create topic with name " + name, e); + } + return name; + } + + default void deleteTopics() { + try { + Set topics = adminClient().listTopics().names().get(5, TimeUnit.SECONDS); + if (!topics.isEmpty()) { + println("Deleting " + String.join(",", topics)); + adminClient().deleteTopics(topics).all().get(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + default ConsumerSettings consumerDefaults(ActorSystem actorSystem) { + return ConsumerSettings.create(actorSystem, new StringDeserializer(), new StringDeserializer()) + .withBootstrapServers(kafkaContainer.getBootstrapServers()) + .withGroupId("test-group-id") + .withProperty(AUTO_OFFSET_RESET_CONFIG, "earliest"); + } + + default KafkaProducer producer() { + return new KafkaProducer<>(Map.of( + ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaContainer.getBootstrapServers() + ), new StringSerializer(), new StringSerializer()); + } + + default void produceString(String topic, String event) { + CompletableFuture completableFuture = new CompletableFuture<>(); + producer().send(new ProducerRecord<>( + topic, event + ), (recordMetadata, e) -> { + if (e != null) { + completableFuture.completeExceptionally(e); + } else { + completableFuture.complete(recordMetadata.topic()); + } + }); + completableFuture.join(); + } + +} diff --git a/thoth-core-akka/src/test/java/fr/maif/eventsourcing/EventProcessorTest.java b/thoth-core-pekko/src/test/java/fr/maif/eventsourcing/EventProcessorTest.java similarity index 98% rename from thoth-core-akka/src/test/java/fr/maif/eventsourcing/EventProcessorTest.java rename to thoth-core-pekko/src/test/java/fr/maif/eventsourcing/EventProcessorTest.java index 0da6f61f..74cf78ce 100644 --- a/thoth-core-akka/src/test/java/fr/maif/eventsourcing/EventProcessorTest.java +++ b/thoth-core-pekko/src/test/java/fr/maif/eventsourcing/EventProcessorTest.java @@ -1,10 +1,10 @@ package fr.maif.eventsourcing; -import akka.actor.ActorSystem; -import akka.stream.Materializer; -import akka.stream.javadsl.Sink; -import akka.stream.javadsl.Source; -import akka.testkit.javadsl.TestKit; +import org.apache.pekko.actor.ActorSystem; +import org.apache.pekko.stream.Materializer; +import org.apache.pekko.stream.javadsl.Sink; +import org.apache.pekko.stream.javadsl.Source; +import org.apache.pekko.testkit.javadsl.TestKit; import fr.maif.akka.eventsourcing.DefaultAggregateStore; import io.vavr.Tuple; import io.vavr.Tuple0; diff --git a/thoth-core-akka/src/test/java/fr/maif/eventsourcing/impl/DefaultAggregateStoreTest.java b/thoth-core-pekko/src/test/java/fr/maif/eventsourcing/impl/DefaultAggregateStoreTest.java similarity index 96% rename from thoth-core-akka/src/test/java/fr/maif/eventsourcing/impl/DefaultAggregateStoreTest.java rename to thoth-core-pekko/src/test/java/fr/maif/eventsourcing/impl/DefaultAggregateStoreTest.java index 74cb455e..b5e2778e 100644 --- a/thoth-core-akka/src/test/java/fr/maif/eventsourcing/impl/DefaultAggregateStoreTest.java +++ b/thoth-core-pekko/src/test/java/fr/maif/eventsourcing/impl/DefaultAggregateStoreTest.java @@ -1,9 +1,9 @@ package fr.maif.eventsourcing.impl; -import akka.actor.ActorSystem; -import akka.stream.javadsl.AsPublisher; -import akka.stream.javadsl.Sink; -import akka.stream.javadsl.Source; +import org.apache.pekko.actor.ActorSystem; +import org.apache.pekko.stream.javadsl.AsPublisher; +import org.apache.pekko.stream.javadsl.Sink; +import org.apache.pekko.stream.javadsl.Source; import fr.maif.Helpers; import fr.maif.Helpers.Viking; import fr.maif.Helpers.VikingEvent; diff --git a/thoth-core-akka/src/test/java/fr/maif/eventsourcing/impl/JdbcTransactionManagerTest.java b/thoth-core-pekko/src/test/java/fr/maif/eventsourcing/impl/JdbcTransactionManagerTest.java similarity index 96% rename from thoth-core-akka/src/test/java/fr/maif/eventsourcing/impl/JdbcTransactionManagerTest.java rename to thoth-core-pekko/src/test/java/fr/maif/eventsourcing/impl/JdbcTransactionManagerTest.java index 2b4652b5..73f69d3b 100644 --- a/thoth-core-akka/src/test/java/fr/maif/eventsourcing/impl/JdbcTransactionManagerTest.java +++ b/thoth-core-pekko/src/test/java/fr/maif/eventsourcing/impl/JdbcTransactionManagerTest.java @@ -1,9 +1,9 @@ package fr.maif.eventsourcing.impl; -import akka.actor.ActorSystem; -import akka.stream.Materializer; -import akka.stream.javadsl.Sink; -import akka.testkit.javadsl.TestKit; +import org.apache.pekko.actor.ActorSystem; +import org.apache.pekko.stream.Materializer; +import org.apache.pekko.stream.javadsl.Sink; +import org.apache.pekko.testkit.javadsl.TestKit; import fr.maif.concurrent.CompletionStages; import fr.maif.akka.jdbc.Convertions; import fr.maif.jdbc.DbUtils; diff --git a/thoth-core-akka/src/test/java/fr/maif/eventsourcing/impl/KafkaEventPublisherTest.java b/thoth-core-pekko/src/test/java/fr/maif/eventsourcing/impl/KafkaEventPublisherTest.java similarity index 84% rename from thoth-core-akka/src/test/java/fr/maif/eventsourcing/impl/KafkaEventPublisherTest.java rename to thoth-core-pekko/src/test/java/fr/maif/eventsourcing/impl/KafkaEventPublisherTest.java index 10973566..604b7896 100644 --- a/thoth-core-akka/src/test/java/fr/maif/eventsourcing/impl/KafkaEventPublisherTest.java +++ b/thoth-core-pekko/src/test/java/fr/maif/eventsourcing/impl/KafkaEventPublisherTest.java @@ -1,17 +1,6 @@ package fr.maif.eventsourcing.impl; -import akka.actor.ActorSystem; -import akka.kafka.ConsumerSettings; -import akka.kafka.ProducerSettings; -import akka.kafka.Subscriptions; -import akka.kafka.javadsl.Consumer; -import akka.kafka.testkit.javadsl.BaseKafkaTest; -import akka.stream.Materializer; -import akka.stream.javadsl.AsPublisher; -import akka.stream.javadsl.Sink; -import akka.stream.javadsl.Source; -import akka.testkit.javadsl.TestKit; -import com.fasterxml.jackson.databind.JsonNode; +import fr.maif.KafkaContainerTest; import fr.maif.akka.eventsourcing.KafkaEventPublisher; import fr.maif.concurrent.CompletionStages; import fr.maif.eventsourcing.Event; @@ -31,27 +20,32 @@ import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.common.serialization.StringDeserializer; import org.apache.kafka.common.serialization.StringSerializer; +import org.apache.pekko.actor.ActorSystem; +import org.apache.pekko.kafka.ConsumerSettings; +import org.apache.pekko.kafka.ProducerSettings; +import org.apache.pekko.kafka.Subscriptions; +import org.apache.pekko.kafka.javadsl.Consumer; +import org.apache.pekko.stream.Materializer; +import org.apache.pekko.stream.javadsl.AsPublisher; +import org.apache.pekko.stream.javadsl.Sink; +import org.apache.pekko.stream.javadsl.Source; +import org.apache.pekko.testkit.javadsl.TestKit; import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; import org.mockito.Mockito; import org.reactivestreams.Publisher; +import tools.jackson.databind.JsonNode; import java.io.IOException; import java.time.Duration; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; import java.util.Objects; -import java.util.Set; import java.util.StringJoiner; import java.util.UUID; import java.util.concurrent.CompletionStage; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; @@ -59,48 +53,14 @@ import static fr.maif.eventsourcing.EventStore.ConcurrentReplayStrategy.SKIP; import static io.vavr.API.println; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.any; -import static org.mockito.Mockito.atLeastOnce; -import static org.mockito.Mockito.atMost; -import static org.mockito.Mockito.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; +import static org.mockito.Mockito.*; @TestInstance(TestInstance.Lifecycle.PER_CLASS) -public class KafkaEventPublisherTest extends BaseKafkaTest { +public class KafkaEventPublisherTest implements KafkaContainerTest { private static final ActorSystem sys = ActorSystem.create("KafkaEventPublisherTest"); private static final Materializer mat = Materializer.createMaterializer(sys); - KafkaEventPublisherTest() { - super(sys, mat, "localhost:29097"); - } - - @BeforeEach - void cleanUpInit() throws ExecutionException, InterruptedException, TimeoutException { - setUpAdminClient(); - try { - Set topics = adminClient().listTopics().names().get(5, TimeUnit.SECONDS); - if (!topics.isEmpty()) { - println("Deleting "+ String.join(",", topics)); - adminClient().deleteTopics(topics).all().get(); - } - } catch (Exception e) {} - } - - @AfterEach - void cleanUpAfter() { - try { - - Set topics = adminClient().listTopics().names().get(); - println("Deleting "+ String.join(",", topics)); - adminClient().deleteTopics(topics).all().get(); - } catch (Exception e) {} - cleanUpAdminClient(); - } - @AfterAll static void afterClass() { TestKit.shutdownActorSystem(sys); @@ -110,7 +70,7 @@ static void afterClass() { @SuppressWarnings("unchecked") public void eventConsumption() throws IOException, InterruptedException { - String topic = createTopic(11, 5, 1); + String topic = createTopic("test"+11, 5, 1); KafkaEventPublisher publisher = createPublisher(topic); EventStore eventStore = mock(EventStore.class); @@ -128,7 +88,7 @@ public void eventConsumption() throws IOException, InterruptedException { Thread.sleep(200); - CompletionStage>> results = Consumer.plainSource(consumerDefaults().withGroupId("test1"), Subscriptions.topics(topic)) + CompletionStage>> results = Consumer.plainSource(consumerDefaults(sys).withGroupId("test1"), Subscriptions.topics(topic)) .map(ConsumerRecord::value) .map(KafkaEventPublisherTest::deserialize) .take(3) @@ -168,7 +128,7 @@ private Publisher txStream(T... values) { @Test @SuppressWarnings("unchecked") public void eventConsumptionWithEventFromDb() throws IOException { - String topic = createTopic(12, 5, 1); + String topic = createTopic("test"+12, 5, 1); KafkaEventPublisher publisher = createPublisher(topic); EventStore eventStore = mock(EventStore.class); when(eventStore.openTransaction()).thenReturn(CompletionStages.successful(Tuple.empty())); @@ -185,7 +145,7 @@ public void eventConsumptionWithEventFromDb() throws IOException { publisher.start(eventStore, NO_STRATEGY); - CompletionStage> results = Consumer.plainSource(consumerDefaults().withGroupId("test2"), Subscriptions.topics(topic)) + CompletionStage> results = Consumer.plainSource(consumerDefaults(sys).withGroupId("test2"), Subscriptions.topics(topic)) .map(ConsumerRecord::value) .take(6) .idleTimeout(Duration.of(5, ChronoUnit.SECONDS)) @@ -215,7 +175,7 @@ public void eventConsumptionWithEventFromDb() throws IOException { @SuppressWarnings("unchecked") public void testRestart() throws IOException { AtomicBoolean failed = new AtomicBoolean(false); - String topic = createTopic(13, 5, 1); + String topic = createTopic("test"+13, 5, 1); KafkaEventPublisher publisher = createPublisher(topic); EventStore eventStore = mock(EventStore.class); when(eventStore.openTransaction()).thenReturn(CompletionStages.successful(Tuple.empty())); @@ -238,7 +198,7 @@ public void testRestart() throws IOException { publisher.start(eventStore, SKIP); - CompletionStage>> results = Consumer.plainSource(consumerDefaults().withGroupId("test3"), Subscriptions.topics(topic)) + CompletionStage>> results = Consumer.plainSource(consumerDefaults(sys).withGroupId("test3"), Subscriptions.topics(topic)) .map(ConsumerRecord::value) .map(KafkaEventPublisherTest::deserialize) .take(6) diff --git a/thoth-core-akka/src/test/java/fr/maif/jdbc/DbUtils.java b/thoth-core-pekko/src/test/java/fr/maif/jdbc/DbUtils.java similarity index 100% rename from thoth-core-akka/src/test/java/fr/maif/jdbc/DbUtils.java rename to thoth-core-pekko/src/test/java/fr/maif/jdbc/DbUtils.java diff --git a/thoth-core-akka/src/test/java/fr/maif/jdbc/SqlTest.java b/thoth-core-pekko/src/test/java/fr/maif/jdbc/SqlTest.java similarity index 94% rename from thoth-core-akka/src/test/java/fr/maif/jdbc/SqlTest.java rename to thoth-core-pekko/src/test/java/fr/maif/jdbc/SqlTest.java index da16d7ae..7d9fa869 100644 --- a/thoth-core-akka/src/test/java/fr/maif/jdbc/SqlTest.java +++ b/thoth-core-pekko/src/test/java/fr/maif/jdbc/SqlTest.java @@ -1,9 +1,9 @@ package fr.maif.jdbc; -import akka.actor.ActorSystem; -import akka.stream.Materializer; -import akka.stream.javadsl.Sink; -import akka.testkit.javadsl.TestKit; +import org.apache.pekko.actor.ActorSystem; +import org.apache.pekko.stream.Materializer; +import org.apache.pekko.stream.javadsl.Sink; +import org.apache.pekko.testkit.javadsl.TestKit; import fr.maif.akka.jdbc.Convertions; import fr.maif.akka.jdbc.Sql; import io.vavr.collection.HashMap; diff --git a/thoth-core-akka/src/test/java/fr/maif/projections/EventuallyConsistentProjectionTest.java b/thoth-core-pekko/src/test/java/fr/maif/projections/EventuallyConsistentProjectionTest.java similarity index 79% rename from thoth-core-akka/src/test/java/fr/maif/projections/EventuallyConsistentProjectionTest.java rename to thoth-core-pekko/src/test/java/fr/maif/projections/EventuallyConsistentProjectionTest.java index c69f4510..5d68a0d8 100644 --- a/thoth-core-akka/src/test/java/fr/maif/projections/EventuallyConsistentProjectionTest.java +++ b/thoth-core-pekko/src/test/java/fr/maif/projections/EventuallyConsistentProjectionTest.java @@ -1,49 +1,45 @@ package fr.maif.projections; -import akka.actor.ActorSystem; -import akka.kafka.testkit.javadsl.TestcontainersKafkaTest; -import akka.stream.Materializer; -import akka.testkit.javadsl.TestKit; -import com.fasterxml.jackson.databind.JsonNode; import fr.maif.Helpers; import fr.maif.Helpers.VikingEvent; +import fr.maif.KafkaContainerTest; import fr.maif.akka.projections.EventuallyConsistentProjection; +import fr.maif.akka.projections.EventuallyConsistentProjection.Config; import fr.maif.eventsourcing.EventEnvelope; import fr.maif.json.Json; import fr.maif.json.JsonFormat; -import fr.maif.akka.projections.EventuallyConsistentProjection.Config; import io.vavr.API; import io.vavr.Tuple; import io.vavr.Tuple0; import io.vavr.concurrent.Future; import io.vavr.control.Option; +import org.apache.pekko.actor.ActorSystem; +import org.apache.pekko.testkit.javadsl.TestKit; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; +import org.testcontainers.junit.jupiter.Testcontainers; +import tools.jackson.databind.JsonNode; import java.time.LocalDateTime; import java.util.UUID; import java.util.concurrent.atomic.AtomicReference; -import static io.vavr.API.Case; import static io.vavr.API.Match; import static io.vavr.API.println; import static org.assertj.core.api.Assertions.assertThat; @TestInstance(TestInstance.Lifecycle.PER_CLASS) -class EventuallyConsistentProjectionTest extends TestcontainersKafkaTest { +@Testcontainers +class EventuallyConsistentProjectionTest implements KafkaContainerTest { private static JsonFormat> vikingEventJsonFormat = new Helpers.VikingEventJsonFormat(); private static final ActorSystem system = ActorSystem.create("test"); - public EventuallyConsistentProjectionTest() { - super(system, Materializer.createMaterializer(system)); - } - @Test void consumer() throws Exception { - String topic = createTopic(); + String topic = createTopic("topic-"+counter.incrementAndGet(), 1, 1); String groupId = "test-group-id"; AtomicReference names = new AtomicReference<>(""); @@ -62,9 +58,9 @@ void consumer() throws Exception { ); Thread.sleep(3000); - resultOf(produceString(topic, stringEvent(new VikingEvent.VikingCreated("1", "Lodbrock")))); - resultOf(produceString(topic, stringEvent(new VikingEvent.VikingCreated("2", "Lagerta")))); - resultOf(produceString(topic, stringEvent(new VikingEvent.VikingUpdated("1", "Lodbrok")))); + produceString(topic, stringEvent(new VikingEvent.VikingCreated("1", "Lodbrock"))); + produceString(topic, stringEvent(new VikingEvent.VikingCreated("2", "Lagerta"))); + produceString(topic, stringEvent(new VikingEvent.VikingUpdated("1", "Lodbrok"))); Thread.sleep(1000); diff --git a/thoth-core-reactor/build.gradle b/thoth-core-reactor/build.gradle index 1af95c83..d661a6b4 100644 --- a/thoth-core-reactor/build.gradle +++ b/thoth-core-reactor/build.gradle @@ -1,6 +1,6 @@ dependencies { - implementation project(':commons-events') + implementation project(':thoth-commons-events') implementation project(':thoth-core') implementation project(':thoth-kafka-consumer-reactor') implementation("io.projectreactor:reactor-core:$reactorVersion") @@ -8,23 +8,20 @@ dependencies { implementation("io.vavr:vavr:$vavrVersion") implementation("io.vavr:vavr-jackson:$vavrJacksonVersion") implementation('org.slf4j:slf4j-api:2.0.7') - implementation("com.fasterxml.uuid:java-uuid-generator:3.1.5") - implementation("com.fasterxml.jackson.datatype:jackson-datatype-jdk8:$jacksonVersion") - implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jacksonVersion") + implementation("com.fasterxml.uuid:java-uuid-generator:5.2.0") + implementation("tools.jackson.core:jackson-databind:$jacksonVersion") implementation("fr.maif:functional-json:$functionalJsonVersion") - testImplementation("org.assertj:assertj-core:3.10.0") + testImplementation("org.assertj:assertj-core:$assertJVersion") testImplementation("com.h2database:h2:1.4.197") - testImplementation("org.mockito:mockito-core:2.22.0") - testImplementation("org.junit.platform:junit-platform-launcher:1.4.2") - testImplementation("org.junit.platform:junit-platform-commons:1.4.2") - testImplementation("org.junit.jupiter:junit-jupiter-engine:5.4.2") - testImplementation("org.junit.vintage:junit-vintage-engine:5.4.2") - testImplementation("net.aichler:jupiter-interface:0.9.1") + testImplementation("org.mockito:mockito-core:$mockitoCoreVersion") + testImplementation(platform("org.junit:junit-bom:$jupiterVersion")) + testImplementation("org.junit.jupiter:junit-jupiter") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") testImplementation("org.scalatest:scalatest_$scalaVersion:3.0.8") - testImplementation("org.testcontainers:kafka:1.18.0") - testImplementation "org.testcontainers:junit-jupiter:1.18.0" - testImplementation "ch.qos.logback:logback-classic:1.4.8" + testImplementation("org.testcontainers:kafka:$testContainerVersion") + testImplementation "org.testcontainers:junit-jupiter:$testContainerVersion" + testImplementation 'ch.qos.logback:logback-classic:1.5.13' } test { diff --git a/thoth-core-reactor/src/test/java/fr/maif/Helpers.java b/thoth-core-reactor/src/test/java/fr/maif/Helpers.java index 66be7204..5925ebd9 100644 --- a/thoth-core-reactor/src/test/java/fr/maif/Helpers.java +++ b/thoth-core-reactor/src/test/java/fr/maif/Helpers.java @@ -1,6 +1,6 @@ package fr.maif; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import fr.maif.concurrent.CompletionStages; import fr.maif.eventsourcing.Command; import fr.maif.eventsourcing.CommandHandler; diff --git a/thoth-core-reactor/src/test/java/fr/maif/reactor/KafkaContainerTest.java b/thoth-core-reactor/src/test/java/fr/maif/reactor/KafkaContainerTest.java index b8b34f37..28acc38a 100644 --- a/thoth-core-reactor/src/test/java/fr/maif/reactor/KafkaContainerTest.java +++ b/thoth-core-reactor/src/test/java/fr/maif/reactor/KafkaContainerTest.java @@ -10,6 +10,7 @@ import org.apache.kafka.common.serialization.StringDeserializer; import org.apache.kafka.common.serialization.StringSerializer; import org.testcontainers.containers.KafkaContainer; +import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; import org.testcontainers.utility.DockerImageName; import reactor.core.publisher.Mono; @@ -32,13 +33,10 @@ public interface KafkaContainerTest { AtomicInteger counter = new AtomicInteger(0); + @Container KafkaContainer kafkaContainer = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:7.4.0")) .withStartupAttempts(2); - static void startContainer() { - kafkaContainer.start(); - } - default String bootstrapServers() { return kafkaContainer.getBootstrapServers(); } diff --git a/thoth-core-reactor/src/test/java/fr/maif/reactor/eventsourcing/KafkaEventPublisherTest.java b/thoth-core-reactor/src/test/java/fr/maif/reactor/eventsourcing/KafkaEventPublisherTest.java index 0ab5ad1e..30db42ea 100644 --- a/thoth-core-reactor/src/test/java/fr/maif/reactor/eventsourcing/KafkaEventPublisherTest.java +++ b/thoth-core-reactor/src/test/java/fr/maif/reactor/eventsourcing/KafkaEventPublisherTest.java @@ -1,6 +1,6 @@ package fr.maif.reactor.eventsourcing; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import fr.maif.concurrent.CompletionStages; import fr.maif.eventsourcing.Event; import fr.maif.eventsourcing.EventEnvelope; @@ -55,12 +55,6 @@ @Testcontainers public class KafkaEventPublisherTest implements KafkaContainerTest { - - @BeforeAll - public static void setUp() { - KafkaContainerTest.startContainer(); - } - @BeforeEach @AfterEach void cleanUpInit() { diff --git a/thoth-core-reactor/src/test/java/fr/maif/reactor/projections/EventuallyConsistentProjectionTest.java b/thoth-core-reactor/src/test/java/fr/maif/reactor/projections/EventuallyConsistentProjectionTest.java index 2261a02b..390b0e71 100644 --- a/thoth-core-reactor/src/test/java/fr/maif/reactor/projections/EventuallyConsistentProjectionTest.java +++ b/thoth-core-reactor/src/test/java/fr/maif/reactor/projections/EventuallyConsistentProjectionTest.java @@ -1,6 +1,6 @@ package fr.maif.reactor.projections; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import fr.maif.Helpers; import fr.maif.Helpers.VikingEvent; import fr.maif.concurrent.CompletionStages; diff --git a/thoth-core/build.gradle b/thoth-core/build.gradle index ca89f356..73cda37c 100644 --- a/thoth-core/build.gradle +++ b/thoth-core/build.gradle @@ -1,30 +1,27 @@ dependencies { - implementation project(':commons-events') - implementation project(':thoth-kafka-consumer-akka') + implementation project(':thoth-commons-events') + implementation project(':thoth-kafka-consumer-pekko') implementation("io.vavr:vavr:$vavrVersion") implementation("io.vavr:vavr-jackson:$vavrJacksonVersion") implementation("com.fasterxml.uuid:java-uuid-generator:3.1.5") - implementation("com.fasterxml.jackson.datatype:jackson-datatype-jdk8:$jacksonVersion") - implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jacksonVersion") implementation("fr.maif:functional-json:$functionalJsonVersion") implementation("org.apache.kafka:kafka-clients:$kafkaVersion") implementation("org.reactivestreams:reactive-streams:1.0.4") implementation("org.slf4j:slf4j-api:1.7.36") - testImplementation("com.typesafe.akka:akka-testkit_$scalaVersion:$akkaVersion") - testImplementation("com.typesafe.akka:akka-stream-testkit_$scalaVersion:$akkaVersion") - testImplementation("com.typesafe.akka:akka-stream-kafka-testkit_$scalaVersion:$alpakkaKafkaVersion") - testImplementation("org.assertj:assertj-core:3.10.0") - testImplementation("com.h2database:h2:1.4.197") - testImplementation("org.mockito:mockito-core:2.22.0") - testImplementation("org.junit.platform:junit-platform-launcher:1.4.2") - testImplementation("org.junit.platform:junit-platform-commons:1.4.2") - testImplementation("org.junit.jupiter:junit-jupiter-engine:5.4.2") - testImplementation("org.junit.vintage:junit-vintage-engine:5.4.2") - testImplementation("net.aichler:jupiter-interface:0.9.1") + testImplementation("org.apache.pekko:pekko-testkit_$scalaVersion:$pekkoVersion") + testImplementation("org.apache.pekko:pekko-stream-testkit_$scalaVersion:$pekkoVersion") + testImplementation "org.apache.pekko:pekko-connectors-kafka-testkit_$scalaVersion:$pekkoKafkaVersion" + + testImplementation("org.assertj:assertj-core:$assertJVersion") + testImplementation('com.h2database:h2:2.2.220') + testImplementation("org.mockito:mockito-core:$mockitoCoreVersion") + testImplementation(platform("org.junit:junit-bom:$jupiterVersion")) + testImplementation("org.junit.jupiter:junit-jupiter") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") testImplementation("org.scalatest:scalatest_$scalaVersion:3.0.8") - testImplementation("org.testcontainers:kafka:1.15.3") + testImplementation("org.testcontainers:kafka:$testContainerVersion") } test { diff --git a/thoth-core/src/main/java/fr/maif/eventsourcing/format/JacksonEventFormat.java b/thoth-core/src/main/java/fr/maif/eventsourcing/format/JacksonEventFormat.java index 571c3dd6..570ac99f 100644 --- a/thoth-core/src/main/java/fr/maif/eventsourcing/format/JacksonEventFormat.java +++ b/thoth-core/src/main/java/fr/maif/eventsourcing/format/JacksonEventFormat.java @@ -1,6 +1,6 @@ package fr.maif.eventsourcing.format; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; public interface JacksonEventFormat extends EventFormat { } diff --git a/thoth-core/src/main/java/fr/maif/eventsourcing/format/JacksonSimpleFormat.java b/thoth-core/src/main/java/fr/maif/eventsourcing/format/JacksonSimpleFormat.java index a3f8269a..20dd1aed 100644 --- a/thoth-core/src/main/java/fr/maif/eventsourcing/format/JacksonSimpleFormat.java +++ b/thoth-core/src/main/java/fr/maif/eventsourcing/format/JacksonSimpleFormat.java @@ -1,6 +1,6 @@ package fr.maif.eventsourcing.format; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import io.vavr.control.Option; import java.util.function.Function; diff --git a/thoth-core/src/main/java/fr/maif/eventsourcing/vanilla/format/JacksonEventFormat.java b/thoth-core/src/main/java/fr/maif/eventsourcing/vanilla/format/JacksonEventFormat.java index f18eafbf..a290a758 100644 --- a/thoth-core/src/main/java/fr/maif/eventsourcing/vanilla/format/JacksonEventFormat.java +++ b/thoth-core/src/main/java/fr/maif/eventsourcing/vanilla/format/JacksonEventFormat.java @@ -1,6 +1,6 @@ package fr.maif.eventsourcing.vanilla.format; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import io.vavr.control.Either; public interface JacksonEventFormat extends EventFormat { diff --git a/thoth-core/src/main/java/fr/maif/eventsourcing/vanilla/format/JacksonSimpleFormat.java b/thoth-core/src/main/java/fr/maif/eventsourcing/vanilla/format/JacksonSimpleFormat.java index f6a5cb8c..95b01df7 100644 --- a/thoth-core/src/main/java/fr/maif/eventsourcing/vanilla/format/JacksonSimpleFormat.java +++ b/thoth-core/src/main/java/fr/maif/eventsourcing/vanilla/format/JacksonSimpleFormat.java @@ -1,6 +1,6 @@ package fr.maif.eventsourcing.vanilla.format; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import io.vavr.control.Option; import java.util.Optional; diff --git a/thoth-core/src/main/java/fr/maif/json/EventEnvelopeJson.java b/thoth-core/src/main/java/fr/maif/json/EventEnvelopeJson.java index dc0f919e..126ef127 100644 --- a/thoth-core/src/main/java/fr/maif/json/EventEnvelopeJson.java +++ b/thoth-core/src/main/java/fr/maif/json/EventEnvelopeJson.java @@ -1,11 +1,10 @@ package fr.maif.json; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.NullNode; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.NullNode; +import tools.jackson.databind.node.ObjectNode; import fr.maif.eventsourcing.Event; import fr.maif.eventsourcing.EventEnvelope; import fr.maif.eventsourcing.format.JacksonEventFormat; @@ -54,10 +53,7 @@ public static EventEnvelope d ObjectNode jsonNode = (ObjectNode) mapper.reader().readTree(event); return deserialize(jsonNode, format, metaFormat, contextFormat, onError, onSuccess); } catch (Exception e) { - try { - onError.accept(mapper.writer().writeValueAsString(event), e); - } catch (JsonProcessingException e1) { - } + onError.accept(mapper.writer().writeValueAsString(event), e); return null; } } @@ -82,10 +78,7 @@ public static EventEnvelope d }); Either read = format.read(eventEnvelope.eventType, eventEnvelope.version, eventNode); read.mapLeft(err -> { - try { - onError.accept(mapper.writer().writeValueAsString(event), err); - } catch (JsonProcessingException e) { - } + onError.accept(mapper.writer().writeValueAsString(event), err); return err; }); eventEnvelope.withEvent(read.getOrNull()); @@ -95,10 +88,7 @@ public static EventEnvelope d onSuccess.accept(build); return build; } catch (Exception e) { - try { - onError.accept(mapper.writer().writeValueAsString(event), e); - } catch (JsonProcessingException e1) { - } + onError.accept(mapper.writer().writeValueAsString(event), e); return null; } } diff --git a/thoth-core/src/main/java/fr/maif/json/EventEnvelopeJsonFormat.java b/thoth-core/src/main/java/fr/maif/json/EventEnvelopeJsonFormat.java index 6aee427e..4faa7b19 100644 --- a/thoth-core/src/main/java/fr/maif/json/EventEnvelopeJsonFormat.java +++ b/thoth-core/src/main/java/fr/maif/json/EventEnvelopeJsonFormat.java @@ -1,7 +1,7 @@ package fr.maif.json; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.NullNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.NullNode; import fr.maif.eventsourcing.Event; import fr.maif.eventsourcing.EventEnvelope; import fr.maif.eventsourcing.Type; diff --git a/thoth-core/src/main/java/fr/maif/json/MapperSingleton.java b/thoth-core/src/main/java/fr/maif/json/MapperSingleton.java index 57b89994..f88085fe 100644 --- a/thoth-core/src/main/java/fr/maif/json/MapperSingleton.java +++ b/thoth-core/src/main/java/fr/maif/json/MapperSingleton.java @@ -1,9 +1,10 @@ package fr.maif.json; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.SerializationFeature; +import tools.jackson.databind.cfg.DateTimeFeature; +import tools.jackson.databind.json.JsonMapper; public final class MapperSingleton { public final static ObjectMapper mapper = buildMapper(); @@ -16,11 +17,11 @@ public static ObjectMapper getInstance() { } private static ObjectMapper buildMapper() { - ObjectMapper mapper = new ObjectMapper(); - mapper.registerModule(new JavaTimeModule()); - mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); + ObjectMapper mapper = JsonMapper.builder() + .configure(DateTimeFeature.WRITE_DATES_AS_TIMESTAMPS, false) + .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false) + .build(); return mapper; } } diff --git a/thoth-core/src/main/java/fr/maif/kafka/JsonSerializer.java b/thoth-core/src/main/java/fr/maif/kafka/JsonSerializer.java index ed39adb7..aca224c7 100644 --- a/thoth-core/src/main/java/fr/maif/kafka/JsonSerializer.java +++ b/thoth-core/src/main/java/fr/maif/kafka/JsonSerializer.java @@ -1,6 +1,6 @@ package fr.maif.kafka; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import fr.maif.eventsourcing.Event; import fr.maif.eventsourcing.EventEnvelope; import fr.maif.eventsourcing.format.EventFormat; diff --git a/thoth-core/src/test/java/fr/maif/Helpers.java b/thoth-core/src/test/java/fr/maif/Helpers.java index 62bdcbd0..25b81a75 100644 --- a/thoth-core/src/test/java/fr/maif/Helpers.java +++ b/thoth-core/src/test/java/fr/maif/Helpers.java @@ -1,6 +1,6 @@ package fr.maif; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import fr.maif.concurrent.CompletionStages; import fr.maif.eventsourcing.*; import fr.maif.eventsourcing.format.JacksonEventFormat; diff --git a/thoth-core/src/test/java/fr/maif/Json.java b/thoth-core/src/test/java/fr/maif/Json.java index 4d0b60b7..ba14c0ae 100644 --- a/thoth-core/src/test/java/fr/maif/Json.java +++ b/thoth-core/src/test/java/fr/maif/Json.java @@ -1,24 +1,20 @@ package fr.maif; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.*; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import tools.jackson.databind.*; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.ObjectNode; -import java.io.IOException; +import static tools.jackson.core.json.JsonWriteFeature.ESCAPE_NON_ASCII; public class Json { private static final ObjectMapper defaultObjectMapper = newDefaultMapper(); private static volatile ObjectMapper objectMapper = null; public static ObjectMapper newDefaultMapper() { - ObjectMapper mapper = new ObjectMapper(); - mapper.registerModule(new Jdk8Module()); - mapper.registerModule(new JavaTimeModule()); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - return mapper; + return JsonMapper.builder() + .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + .build(); } /** @@ -37,18 +33,14 @@ public static ObjectMapper mapper() { } private static String generateJson(Object o, boolean prettyPrint, boolean escapeNonASCII) { - try { - ObjectWriter writer = mapper().writer(); - if (prettyPrint) { - writer = writer.with(SerializationFeature.INDENT_OUTPUT); - } - if (escapeNonASCII) { - writer = writer.with(JsonGenerator.Feature.ESCAPE_NON_ASCII); - } - return writer.writeValueAsString(o); - } catch (IOException e) { - throw new RuntimeException(e); + ObjectWriter writer = mapper().writer(); + if (prettyPrint) { + writer = writer.with(SerializationFeature.INDENT_OUTPUT); + } + if (escapeNonASCII) { + writer = writer.with(ESCAPE_NON_ASCII); } + return writer.writeValueAsString(o); } /** diff --git a/thoth-core/src/test/java/fr/maif/json/EventEnvelopeJsonFormatTest.java b/thoth-core/src/test/java/fr/maif/json/EventEnvelopeJsonFormatTest.java index f3dbdf7d..25607569 100644 --- a/thoth-core/src/test/java/fr/maif/json/EventEnvelopeJsonFormatTest.java +++ b/thoth-core/src/test/java/fr/maif/json/EventEnvelopeJsonFormatTest.java @@ -1,12 +1,12 @@ package fr.maif.json; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; import fr.maif.Helpers; -import io.vavr.Tuple0; import fr.maif.eventsourcing.EventEnvelope; +import io.vavr.Tuple0; import io.vavr.control.Either; import org.junit.jupiter.api.Test; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ObjectNode; import java.time.LocalDateTime; import java.util.UUID; @@ -184,7 +184,7 @@ public void jsonSchema() { @Test public void legacyMethod() { - Either read = eventReader.jacksonEventFormat(seq -> seq.map(e -> e.message).mkString(", ")).read(VikingCreatedV1.name(), VikingCreatedV1.version(), eventJson); + Either read = eventReader.jacksonEventFormat(seq -> seq.map(JsResult.Error::message).mkString(", ")).read(VikingCreatedV1.name(), VikingCreatedV1.version(), eventJson); assertThat(read).isEqualTo(Either.right(event)); } } \ No newline at end of file diff --git a/thoth-core/src/test/java/fr/maif/kafka/JsonSerDeserializerTest.java b/thoth-core/src/test/java/fr/maif/kafka/JsonSerDeserializerTest.java index 11ff07c4..00eb0e1e 100644 --- a/thoth-core/src/test/java/fr/maif/kafka/JsonSerDeserializerTest.java +++ b/thoth-core/src/test/java/fr/maif/kafka/JsonSerDeserializerTest.java @@ -1,7 +1,7 @@ package fr.maif.kafka; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.TextNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.StringNode; import fr.maif.Helpers; import fr.maif.eventsourcing.EventEnvelope; import fr.maif.eventsourcing.format.JacksonSimpleFormat; @@ -30,8 +30,8 @@ public void test() { .withVersion(Helpers.VikingEvent.VikingCreatedV1.version()) .withTotalMessageInTransaction(1) .withNumMessageInTransaction(1) - .withContext(new TextNode("context")) - .withMetadata(new TextNode("metadata")) + .withContext(new StringNode("context")) + .withMetadata(new StringNode("metadata")) .withTransactionId("1") .withEvent(new Helpers.VikingEvent.VikingCreated("1", "ragnar")) .build(); diff --git a/demo/build.gradle b/thoth-demo/build.gradle similarity index 100% rename from demo/build.gradle rename to thoth-demo/build.gradle diff --git a/demo/demo-in-memory-vanilla/build.gradle b/thoth-demo/demo-in-memory-vanilla/build.gradle similarity index 93% rename from demo/demo-in-memory-vanilla/build.gradle rename to thoth-demo/demo-in-memory-vanilla/build.gradle index 6a61d218..f3f1fc90 100644 --- a/demo/demo-in-memory-vanilla/build.gradle +++ b/thoth-demo/demo-in-memory-vanilla/build.gradle @@ -15,7 +15,7 @@ compileTestJava { dependencies { - implementation project(':commons-events') + implementation project(':thoth-commons-events') implementation project(':thoth-core') implementation project(':thoth-core-reactor') implementation project(':thoth-kafka-consumer-reactor') diff --git a/demo/demo-in-memory-vanilla/src/main/java/com/example/demo/Account.java b/thoth-demo/demo-in-memory-vanilla/src/main/java/com/example/demo/Account.java similarity index 100% rename from demo/demo-in-memory-vanilla/src/main/java/com/example/demo/Account.java rename to thoth-demo/demo-in-memory-vanilla/src/main/java/com/example/demo/Account.java diff --git a/demo/demo-in-memory-vanilla/src/main/java/com/example/demo/Bank.java b/thoth-demo/demo-in-memory-vanilla/src/main/java/com/example/demo/Bank.java similarity index 100% rename from demo/demo-in-memory-vanilla/src/main/java/com/example/demo/Bank.java rename to thoth-demo/demo-in-memory-vanilla/src/main/java/com/example/demo/Bank.java diff --git a/demo/demo-in-memory-vanilla/src/main/java/com/example/demo/BankCommand.java b/thoth-demo/demo-in-memory-vanilla/src/main/java/com/example/demo/BankCommand.java similarity index 100% rename from demo/demo-in-memory-vanilla/src/main/java/com/example/demo/BankCommand.java rename to thoth-demo/demo-in-memory-vanilla/src/main/java/com/example/demo/BankCommand.java diff --git a/demo/demo-in-memory-vanilla/src/main/java/com/example/demo/BankCommandHandler.java b/thoth-demo/demo-in-memory-vanilla/src/main/java/com/example/demo/BankCommandHandler.java similarity index 100% rename from demo/demo-in-memory-vanilla/src/main/java/com/example/demo/BankCommandHandler.java rename to thoth-demo/demo-in-memory-vanilla/src/main/java/com/example/demo/BankCommandHandler.java diff --git a/demo/demo-in-memory-vanilla/src/main/java/com/example/demo/BankEvent.java b/thoth-demo/demo-in-memory-vanilla/src/main/java/com/example/demo/BankEvent.java similarity index 100% rename from demo/demo-in-memory-vanilla/src/main/java/com/example/demo/BankEvent.java rename to thoth-demo/demo-in-memory-vanilla/src/main/java/com/example/demo/BankEvent.java diff --git a/demo/demo-in-memory-vanilla/src/main/java/com/example/demo/BankEventHandler.java b/thoth-demo/demo-in-memory-vanilla/src/main/java/com/example/demo/BankEventHandler.java similarity index 100% rename from demo/demo-in-memory-vanilla/src/main/java/com/example/demo/BankEventHandler.java rename to thoth-demo/demo-in-memory-vanilla/src/main/java/com/example/demo/BankEventHandler.java diff --git a/demo/demo-in-memory-vanilla/src/main/java/com/example/demo/DemoApplication.java b/thoth-demo/demo-in-memory-vanilla/src/main/java/com/example/demo/DemoApplication.java similarity index 100% rename from demo/demo-in-memory-vanilla/src/main/java/com/example/demo/DemoApplication.java rename to thoth-demo/demo-in-memory-vanilla/src/main/java/com/example/demo/DemoApplication.java diff --git a/demo/demo-in-memory-vanilla/src/main/resources/application.properties b/thoth-demo/demo-in-memory-vanilla/src/main/resources/application.properties similarity index 100% rename from demo/demo-in-memory-vanilla/src/main/resources/application.properties rename to thoth-demo/demo-in-memory-vanilla/src/main/resources/application.properties diff --git a/demo/demo-in-memory/build.gradle b/thoth-demo/demo-in-memory/build.gradle similarity index 93% rename from demo/demo-in-memory/build.gradle rename to thoth-demo/demo-in-memory/build.gradle index 6a61d218..f3f1fc90 100644 --- a/demo/demo-in-memory/build.gradle +++ b/thoth-demo/demo-in-memory/build.gradle @@ -15,7 +15,7 @@ compileTestJava { dependencies { - implementation project(':commons-events') + implementation project(':thoth-commons-events') implementation project(':thoth-core') implementation project(':thoth-core-reactor') implementation project(':thoth-kafka-consumer-reactor') diff --git a/demo/demo-in-memory/src/main/java/com/example/demo/Account.java b/thoth-demo/demo-in-memory/src/main/java/com/example/demo/Account.java similarity index 100% rename from demo/demo-in-memory/src/main/java/com/example/demo/Account.java rename to thoth-demo/demo-in-memory/src/main/java/com/example/demo/Account.java diff --git a/demo/demo-in-memory/src/main/java/com/example/demo/Bank.java b/thoth-demo/demo-in-memory/src/main/java/com/example/demo/Bank.java similarity index 100% rename from demo/demo-in-memory/src/main/java/com/example/demo/Bank.java rename to thoth-demo/demo-in-memory/src/main/java/com/example/demo/Bank.java diff --git a/demo/demo-in-memory/src/main/java/com/example/demo/BankCommand.java b/thoth-demo/demo-in-memory/src/main/java/com/example/demo/BankCommand.java similarity index 100% rename from demo/demo-in-memory/src/main/java/com/example/demo/BankCommand.java rename to thoth-demo/demo-in-memory/src/main/java/com/example/demo/BankCommand.java diff --git a/demo/demo-in-memory/src/main/java/com/example/demo/BankCommandHandler.java b/thoth-demo/demo-in-memory/src/main/java/com/example/demo/BankCommandHandler.java similarity index 100% rename from demo/demo-in-memory/src/main/java/com/example/demo/BankCommandHandler.java rename to thoth-demo/demo-in-memory/src/main/java/com/example/demo/BankCommandHandler.java diff --git a/demo/demo-in-memory/src/main/java/com/example/demo/BankEvent.java b/thoth-demo/demo-in-memory/src/main/java/com/example/demo/BankEvent.java similarity index 100% rename from demo/demo-in-memory/src/main/java/com/example/demo/BankEvent.java rename to thoth-demo/demo-in-memory/src/main/java/com/example/demo/BankEvent.java diff --git a/demo/demo-in-memory/src/main/java/com/example/demo/BankEventHandler.java b/thoth-demo/demo-in-memory/src/main/java/com/example/demo/BankEventHandler.java similarity index 100% rename from demo/demo-in-memory/src/main/java/com/example/demo/BankEventHandler.java rename to thoth-demo/demo-in-memory/src/main/java/com/example/demo/BankEventHandler.java diff --git a/demo/demo-in-memory/src/main/java/com/example/demo/DemoApplication.java b/thoth-demo/demo-in-memory/src/main/java/com/example/demo/DemoApplication.java similarity index 100% rename from demo/demo-in-memory/src/main/java/com/example/demo/DemoApplication.java rename to thoth-demo/demo-in-memory/src/main/java/com/example/demo/DemoApplication.java diff --git a/demo/demo-in-memory/src/main/resources/application.properties b/thoth-demo/demo-in-memory/src/main/resources/application.properties similarity index 100% rename from demo/demo-in-memory/src/main/resources/application.properties rename to thoth-demo/demo-in-memory/src/main/resources/application.properties diff --git a/demo/demo-postgres-kafka-reactive/build.gradle b/thoth-demo/demo-postgres-kafka-reactive/build.gradle similarity index 86% rename from demo/demo-postgres-kafka-reactive/build.gradle rename to thoth-demo/demo-postgres-kafka-reactive/build.gradle index 847465f6..e537cda9 100644 --- a/demo/demo-postgres-kafka-reactive/build.gradle +++ b/thoth-demo/demo-postgres-kafka-reactive/build.gradle @@ -19,13 +19,13 @@ tasks.withType(Javadoc) { dependencies { - implementation project(':commons-events') + implementation project(':thoth-commons-events') implementation project(':thoth-core') implementation project(':thoth-core-reactor') implementation project(':thoth-jooq-reactor') - implementation project(':thoth-kafka-consumer-akka') + implementation project(':thoth-kafka-consumer-pekko') implementation("io.vavr:vavr:$vavrVersion") - implementation("com.fasterxml.jackson.core:jackson-databind:$jacksonVersion") + implementation("tools.jackson.core:jackson-databind:$jacksonVersion") implementation("fr.maif:functional-json:$functionalJsonVersion") implementation("com.fasterxml.uuid:java-uuid-generator:4.0.1") implementation('org.postgresql:postgresql:42.7.7') diff --git a/demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/Account.java b/thoth-demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/Account.java similarity index 100% rename from demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/Account.java rename to thoth-demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/Account.java diff --git a/demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/Bank.java b/thoth-demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/Bank.java similarity index 100% rename from demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/Bank.java rename to thoth-demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/Bank.java diff --git a/demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/BankCommand.java b/thoth-demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/BankCommand.java similarity index 100% rename from demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/BankCommand.java rename to thoth-demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/BankCommand.java diff --git a/demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/BankCommandHandler.java b/thoth-demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/BankCommandHandler.java similarity index 100% rename from demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/BankCommandHandler.java rename to thoth-demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/BankCommandHandler.java diff --git a/demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/BankEvent.java b/thoth-demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/BankEvent.java similarity index 100% rename from demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/BankEvent.java rename to thoth-demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/BankEvent.java diff --git a/demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/BankEventFormat.java b/thoth-demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/BankEventFormat.java similarity index 100% rename from demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/BankEventFormat.java rename to thoth-demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/BankEventFormat.java diff --git a/demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/BankEventHandler.java b/thoth-demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/BankEventHandler.java similarity index 100% rename from demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/BankEventHandler.java rename to thoth-demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/BankEventHandler.java diff --git a/demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/DemoApplication.java b/thoth-demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/DemoApplication.java similarity index 100% rename from demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/DemoApplication.java rename to thoth-demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/DemoApplication.java diff --git a/demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/WithdrawByMonthProjection.java b/thoth-demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/WithdrawByMonthProjection.java similarity index 100% rename from demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/WithdrawByMonthProjection.java rename to thoth-demo/demo-postgres-kafka-reactive/src/main/java/com/example/demo/WithdrawByMonthProjection.java diff --git a/demo/demo-postgres-kafka/build.gradle b/thoth-demo/demo-postgres-kafka/build.gradle similarity index 88% rename from demo/demo-postgres-kafka/build.gradle rename to thoth-demo/demo-postgres-kafka/build.gradle index 2c49b8a8..987ae1ec 100644 --- a/demo/demo-postgres-kafka/build.gradle +++ b/thoth-demo/demo-postgres-kafka/build.gradle @@ -14,12 +14,12 @@ compileTestJava { dependencies { - implementation project(':commons-events') + implementation project(':thoth-commons-events') implementation project(':thoth-core') implementation project(':thoth-core-reactor') implementation project(':thoth-jooq') implementation project(':thoth-kafka-consumer-reactor') - implementation("com.fasterxml.jackson.core:jackson-databind:$jacksonVersion") + implementation("tools.jackson.core:jackson-databind:$jacksonVersion") implementation("io.projectreactor:reactor-core:$reactorVersion") implementation "io.projectreactor.kafka:reactor-kafka:$reactorKafkaVersion" implementation("io.vavr:vavr:$vavrVersion") diff --git a/demo/demo-postgres-kafka/src/main/java/com/example/demo/Account.java b/thoth-demo/demo-postgres-kafka/src/main/java/com/example/demo/Account.java similarity index 100% rename from demo/demo-postgres-kafka/src/main/java/com/example/demo/Account.java rename to thoth-demo/demo-postgres-kafka/src/main/java/com/example/demo/Account.java diff --git a/demo/demo-postgres-kafka/src/main/java/com/example/demo/Bank.java b/thoth-demo/demo-postgres-kafka/src/main/java/com/example/demo/Bank.java similarity index 100% rename from demo/demo-postgres-kafka/src/main/java/com/example/demo/Bank.java rename to thoth-demo/demo-postgres-kafka/src/main/java/com/example/demo/Bank.java diff --git a/demo/demo-postgres-kafka/src/main/java/com/example/demo/BankAggregateStore.java b/thoth-demo/demo-postgres-kafka/src/main/java/com/example/demo/BankAggregateStore.java similarity index 100% rename from demo/demo-postgres-kafka/src/main/java/com/example/demo/BankAggregateStore.java rename to thoth-demo/demo-postgres-kafka/src/main/java/com/example/demo/BankAggregateStore.java diff --git a/demo/demo-postgres-kafka/src/main/java/com/example/demo/BankCommand.java b/thoth-demo/demo-postgres-kafka/src/main/java/com/example/demo/BankCommand.java similarity index 100% rename from demo/demo-postgres-kafka/src/main/java/com/example/demo/BankCommand.java rename to thoth-demo/demo-postgres-kafka/src/main/java/com/example/demo/BankCommand.java diff --git a/demo/demo-postgres-kafka/src/main/java/com/example/demo/BankCommandHandler.java b/thoth-demo/demo-postgres-kafka/src/main/java/com/example/demo/BankCommandHandler.java similarity index 100% rename from demo/demo-postgres-kafka/src/main/java/com/example/demo/BankCommandHandler.java rename to thoth-demo/demo-postgres-kafka/src/main/java/com/example/demo/BankCommandHandler.java diff --git a/demo/demo-postgres-kafka/src/main/java/com/example/demo/BankEvent.java b/thoth-demo/demo-postgres-kafka/src/main/java/com/example/demo/BankEvent.java similarity index 100% rename from demo/demo-postgres-kafka/src/main/java/com/example/demo/BankEvent.java rename to thoth-demo/demo-postgres-kafka/src/main/java/com/example/demo/BankEvent.java diff --git a/demo/demo-postgres-kafka/src/main/java/com/example/demo/BankEventFormat.java b/thoth-demo/demo-postgres-kafka/src/main/java/com/example/demo/BankEventFormat.java similarity index 97% rename from demo/demo-postgres-kafka/src/main/java/com/example/demo/BankEventFormat.java rename to thoth-demo/demo-postgres-kafka/src/main/java/com/example/demo/BankEventFormat.java index b83b3f3e..360a59d3 100644 --- a/demo/demo-postgres-kafka/src/main/java/com/example/demo/BankEventFormat.java +++ b/thoth-demo/demo-postgres-kafka/src/main/java/com/example/demo/BankEventFormat.java @@ -1,6 +1,6 @@ package com.example.demo; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import fr.maif.eventsourcing.Result; import fr.maif.eventsourcing.vanilla.format.JacksonEventFormat; import fr.maif.json.Json; diff --git a/demo/demo-postgres-kafka/src/main/java/com/example/demo/BankEventHandler.java b/thoth-demo/demo-postgres-kafka/src/main/java/com/example/demo/BankEventHandler.java similarity index 100% rename from demo/demo-postgres-kafka/src/main/java/com/example/demo/BankEventHandler.java rename to thoth-demo/demo-postgres-kafka/src/main/java/com/example/demo/BankEventHandler.java diff --git a/demo/demo-postgres-kafka/src/main/java/com/example/demo/DemoApplication.java b/thoth-demo/demo-postgres-kafka/src/main/java/com/example/demo/DemoApplication.java similarity index 100% rename from demo/demo-postgres-kafka/src/main/java/com/example/demo/DemoApplication.java rename to thoth-demo/demo-postgres-kafka/src/main/java/com/example/demo/DemoApplication.java diff --git a/demo/demo-postgres-kafka/src/main/java/com/example/demo/MeanWithdrawProjection.java b/thoth-demo/demo-postgres-kafka/src/main/java/com/example/demo/MeanWithdrawProjection.java similarity index 100% rename from demo/demo-postgres-kafka/src/main/java/com/example/demo/MeanWithdrawProjection.java rename to thoth-demo/demo-postgres-kafka/src/main/java/com/example/demo/MeanWithdrawProjection.java diff --git a/demo/demo-postgres-kafka/src/main/resources/application.properties b/thoth-demo/demo-postgres-kafka/src/main/resources/application.properties similarity index 100% rename from demo/demo-postgres-kafka/src/main/resources/application.properties rename to thoth-demo/demo-postgres-kafka/src/main/resources/application.properties diff --git a/thoth-jooq-akka/build.gradle b/thoth-jooq-pekko/build.gradle similarity index 51% rename from thoth-jooq-akka/build.gradle rename to thoth-jooq-pekko/build.gradle index 970af205..51392324 100644 --- a/thoth-jooq-akka/build.gradle +++ b/thoth-jooq-pekko/build.gradle @@ -1,31 +1,35 @@ dependencies { - implementation project(':commons-events') + implementation project(':thoth-commons-events') implementation project(':thoth-core') - implementation project(':thoth-core-akka') + implementation project(':thoth-core-pekko') implementation("io.vavr:vavr:$vavrVersion") implementation("org.jooq:jooq:$jooqVersion") implementation("fr.maif:jooq-async-api:$jooqAsyncVersion") implementation("fr.maif:functional-json:$functionalJsonVersion") - implementation("com.typesafe.akka:akka-stream_$scalaVersion:$akkaVersion") - implementation("com.typesafe.akka:akka-stream-kafka_$scalaVersion:$alpakkaKafkaVersion") + + implementation "org.apache.pekko:pekko-actor_$scalaVersion:$pekkoVersion" + implementation "org.apache.pekko:pekko-stream_$scalaVersion:$pekkoVersion" + implementation "org.apache.pekko:pekko-slf4j_$scalaVersion:$pekkoVersion" + implementation "org.apache.pekko:pekko-connectors-kafka_$scalaVersion:$pekkoKafkaVersion" implementation("io.vertx:vertx-pg-client:$vertxSqlVersion") implementation("io.vavr:vavr-jackson:$vavrJacksonVersion") - implementation("com.fasterxml.jackson.datatype:jackson-datatype-jdk8:$jacksonVersion") - implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jacksonVersion") + testImplementation "org.apache.pekko:pekko-testkit_$scalaVersion:$pekkoVersion" + testImplementation "org.apache.pekko:pekko-stream-testkit_$scalaVersion:$pekkoVersion" testImplementation("fr.maif:jooq-async-jdbc:$jooqAsyncVersion") testImplementation("fr.maif:jooq-async-reactive:$jooqAsyncVersion") - testImplementation("org.assertj:assertj-core:3.10.0") + testImplementation("org.assertj:assertj-core:$assertJVersion") testImplementation('org.postgresql:postgresql:42.7.7') - testImplementation("org.mockito:mockito-all:1.10.19") - testImplementation("org.junit.jupiter:junit-jupiter:5.9.3") + testImplementation("org.mockito:mockito-core:$mockitoCoreVersion") + testImplementation(platform("org.junit:junit-bom:$jupiterVersion")) + testImplementation("org.junit.jupiter:junit-jupiter") testRuntimeOnly 'org.junit.platform:junit-platform-launcher' testImplementation "org.testcontainers:junit-jupiter:$testContainerVersion" testImplementation "org.testcontainers:testcontainers:$testContainerVersion" testImplementation "org.testcontainers:postgresql:$testContainerVersion" - testImplementation 'org.mockito:mockito-core:5.18.0' + testImplementation "org.mockito:mockito-core:$mockitoCoreVersion" } test { diff --git a/thoth-jooq-akka/readme.md b/thoth-jooq-pekko/readme.md similarity index 100% rename from thoth-jooq-akka/readme.md rename to thoth-jooq-pekko/readme.md diff --git a/thoth-jooq-akka/src/main/java/fr/maif/eventsourcing/ReactivePostgresEventStore.java b/thoth-jooq-pekko/src/main/java/fr/maif/eventsourcing/ReactivePostgresEventStore.java similarity index 97% rename from thoth-jooq-akka/src/main/java/fr/maif/eventsourcing/ReactivePostgresEventStore.java rename to thoth-jooq-pekko/src/main/java/fr/maif/eventsourcing/ReactivePostgresEventStore.java index 6254b105..ccf58a5b 100644 --- a/thoth-jooq-akka/src/main/java/fr/maif/eventsourcing/ReactivePostgresEventStore.java +++ b/thoth-jooq-pekko/src/main/java/fr/maif/eventsourcing/ReactivePostgresEventStore.java @@ -1,14 +1,14 @@ package fr.maif.eventsourcing; -import akka.NotUsed; -import akka.actor.ActorSystem; -import akka.stream.Materializer; -import akka.stream.javadsl.AsPublisher; -import akka.stream.javadsl.Sink; -import akka.stream.javadsl.Source; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.NullNode; +import org.apache.pekko.NotUsed; +import org.apache.pekko.actor.ActorSystem; +import org.apache.pekko.stream.Materializer; +import org.apache.pekko.stream.javadsl.AsPublisher; +import org.apache.pekko.stream.javadsl.Sink; +import org.apache.pekko.stream.javadsl.Source; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.NullNode; import fr.maif.eventsourcing.format.JacksonEventFormat; import fr.maif.eventsourcing.format.JacksonSimpleFormat; import fr.maif.jooq.PgAsyncPool; diff --git a/thoth-jooq-akka/src/main/java/fr/maif/eventsourcing/ReactivePostgresKafkaEventProcessor.java b/thoth-jooq-pekko/src/main/java/fr/maif/eventsourcing/ReactivePostgresKafkaEventProcessor.java similarity index 98% rename from thoth-jooq-akka/src/main/java/fr/maif/eventsourcing/ReactivePostgresKafkaEventProcessor.java rename to thoth-jooq-pekko/src/main/java/fr/maif/eventsourcing/ReactivePostgresKafkaEventProcessor.java index cef96301..8d42ba32 100644 --- a/thoth-jooq-akka/src/main/java/fr/maif/eventsourcing/ReactivePostgresKafkaEventProcessor.java +++ b/thoth-jooq-pekko/src/main/java/fr/maif/eventsourcing/ReactivePostgresKafkaEventProcessor.java @@ -1,7 +1,7 @@ package fr.maif.eventsourcing; -import akka.actor.ActorSystem; -import akka.kafka.ProducerSettings; +import org.apache.pekko.actor.ActorSystem; +import org.apache.pekko.kafka.ProducerSettings; import fr.maif.eventsourcing.format.JacksonEventFormat; import fr.maif.eventsourcing.format.JacksonSimpleFormat; import fr.maif.akka.eventsourcing.DefaultAggregateStore; diff --git a/thoth-jooq-akka/src/main/java/fr/maif/eventsourcing/ReactivePostgresKafkaEventProcessorBuilder.java b/thoth-jooq-pekko/src/main/java/fr/maif/eventsourcing/ReactivePostgresKafkaEventProcessorBuilder.java similarity index 99% rename from thoth-jooq-akka/src/main/java/fr/maif/eventsourcing/ReactivePostgresKafkaEventProcessorBuilder.java rename to thoth-jooq-pekko/src/main/java/fr/maif/eventsourcing/ReactivePostgresKafkaEventProcessorBuilder.java index 47df8389..a7b6ae42 100644 --- a/thoth-jooq-akka/src/main/java/fr/maif/eventsourcing/ReactivePostgresKafkaEventProcessorBuilder.java +++ b/thoth-jooq-pekko/src/main/java/fr/maif/eventsourcing/ReactivePostgresKafkaEventProcessorBuilder.java @@ -1,7 +1,7 @@ package fr.maif.eventsourcing; -import akka.actor.ActorSystem; -import akka.kafka.ProducerSettings; +import org.apache.pekko.actor.ActorSystem; +import org.apache.pekko.kafka.ProducerSettings; import fr.maif.eventsourcing.EventStore.ConcurrentReplayStrategy; import fr.maif.eventsourcing.format.JacksonEventFormat; import fr.maif.eventsourcing.format.JacksonSimpleFormat; diff --git a/thoth-jooq-akka/src/main/java/fr/maif/eventsourcing/ReactiveTransactionManager.java b/thoth-jooq-pekko/src/main/java/fr/maif/eventsourcing/ReactiveTransactionManager.java similarity index 100% rename from thoth-jooq-akka/src/main/java/fr/maif/eventsourcing/ReactiveTransactionManager.java rename to thoth-jooq-pekko/src/main/java/fr/maif/eventsourcing/ReactiveTransactionManager.java diff --git a/thoth-jooq-akka/src/main/java/fr/maif/eventsourcing/TableNames.java b/thoth-jooq-pekko/src/main/java/fr/maif/eventsourcing/TableNames.java similarity index 100% rename from thoth-jooq-akka/src/main/java/fr/maif/eventsourcing/TableNames.java rename to thoth-jooq-pekko/src/main/java/fr/maif/eventsourcing/TableNames.java diff --git a/thoth-jooq-akka/src/test/java/fr/maif/eventsourcing/AbstractPostgresEventStoreTest.java b/thoth-jooq-pekko/src/test/java/fr/maif/eventsourcing/AbstractPostgresEventStoreTest.java similarity index 98% rename from thoth-jooq-akka/src/test/java/fr/maif/eventsourcing/AbstractPostgresEventStoreTest.java rename to thoth-jooq-pekko/src/test/java/fr/maif/eventsourcing/AbstractPostgresEventStoreTest.java index eb8396fe..345c7eef 100644 --- a/thoth-jooq-akka/src/test/java/fr/maif/eventsourcing/AbstractPostgresEventStoreTest.java +++ b/thoth-jooq-pekko/src/test/java/fr/maif/eventsourcing/AbstractPostgresEventStoreTest.java @@ -1,12 +1,12 @@ package fr.maif.eventsourcing; -import akka.NotUsed; -import akka.actor.ActorSystem; -import akka.stream.Materializer; -import akka.stream.javadsl.Sink; -import akka.stream.javadsl.Source; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.pekko.NotUsed; +import org.apache.pekko.actor.ActorSystem; +import org.apache.pekko.stream.Materializer; +import org.apache.pekko.stream.javadsl.Sink; +import org.apache.pekko.stream.javadsl.Source; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; import fr.maif.eventsourcing.format.JacksonEventFormat; import fr.maif.eventsourcing.format.JacksonSimpleFormat; import fr.maif.jooq.PgAsyncPool; diff --git a/thoth-jooq-akka/src/test/java/fr/maif/eventsourcing/JdbcPostgresEventStoreTest.java b/thoth-jooq-pekko/src/test/java/fr/maif/eventsourcing/JdbcPostgresEventStoreTest.java similarity index 100% rename from thoth-jooq-akka/src/test/java/fr/maif/eventsourcing/JdbcPostgresEventStoreTest.java rename to thoth-jooq-pekko/src/test/java/fr/maif/eventsourcing/JdbcPostgresEventStoreTest.java diff --git a/thoth-jooq-akka/src/test/java/fr/maif/eventsourcing/ReactivePostgresEventStoreTest.java b/thoth-jooq-pekko/src/test/java/fr/maif/eventsourcing/ReactivePostgresEventStoreTest.java similarity index 100% rename from thoth-jooq-akka/src/test/java/fr/maif/eventsourcing/ReactivePostgresEventStoreTest.java rename to thoth-jooq-pekko/src/test/java/fr/maif/eventsourcing/ReactivePostgresEventStoreTest.java diff --git a/thoth-jooq-reactor/build.gradle b/thoth-jooq-reactor/build.gradle index 09c55090..6b040e08 100644 --- a/thoth-jooq-reactor/build.gradle +++ b/thoth-jooq-reactor/build.gradle @@ -1,7 +1,7 @@ dependencies { - implementation project(':commons-events') + implementation project(':thoth-commons-events') implementation project(':thoth-core') implementation project(':thoth-core-reactor') implementation("io.vavr:vavr:$vavrVersion") @@ -14,21 +14,20 @@ dependencies { implementation("io.vertx:vertx-pg-client:$vertxSqlVersion") implementation("fr.maif:jooq-async-reactive:$jooqAsyncVersion") implementation("io.vavr:vavr-jackson:$vavrJacksonVersion") - implementation("com.fasterxml.jackson.datatype:jackson-datatype-jdk8:$jacksonVersion") - implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jacksonVersion") implementation("org.scala-lang:scala-library:2.13.16") testImplementation("fr.maif:jooq-async-jdbc:$jooqAsyncVersion") testImplementation("fr.maif:jooq-async-reactive:$jooqAsyncVersion") - testImplementation("org.assertj:assertj-core:3.10.0") + testImplementation("org.assertj:assertj-core:$assertJVersion") testImplementation('org.postgresql:postgresql:42.7.7') - testImplementation("org.mockito:mockito-all:1.10.19") - testImplementation("org.junit.jupiter:junit-jupiter:5.9.3") + testImplementation("org.mockito:mockito-core:$mockitoCoreVersion") + testImplementation(platform("org.junit:junit-bom:$jupiterVersion")) + testImplementation("org.junit.jupiter:junit-jupiter") testRuntimeOnly 'org.junit.platform:junit-platform-launcher' testImplementation "org.testcontainers:junit-jupiter:$testContainerVersion" testImplementation "org.testcontainers:testcontainers:$testContainerVersion" testImplementation "org.testcontainers:postgresql:$testContainerVersion" - testImplementation 'org.mockito:mockito-core:5.18.0' + testImplementation "org.mockito:mockito-core:$mockitoCoreVersion" } test { diff --git a/thoth-jooq-reactor/src/main/java/fr/maif/eventsourcing/ReactivePostgresEventStore.java b/thoth-jooq-reactor/src/main/java/fr/maif/eventsourcing/ReactivePostgresEventStore.java index 61e17689..9eb05359 100644 --- a/thoth-jooq-reactor/src/main/java/fr/maif/eventsourcing/ReactivePostgresEventStore.java +++ b/thoth-jooq-reactor/src/main/java/fr/maif/eventsourcing/ReactivePostgresEventStore.java @@ -1,8 +1,8 @@ package fr.maif.eventsourcing; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.NullNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.NullNode; import fr.maif.eventsourcing.format.JacksonEventFormat; import fr.maif.eventsourcing.format.JacksonSimpleFormat; import fr.maif.jooq.PgAsyncPool; diff --git a/thoth-jooq-reactor/src/test/java/fr/maif/eventsourcing/AbstractPostgresEventStoreTest.java b/thoth-jooq-reactor/src/test/java/fr/maif/eventsourcing/AbstractPostgresEventStoreTest.java index daecc48b..eed786de 100644 --- a/thoth-jooq-reactor/src/test/java/fr/maif/eventsourcing/AbstractPostgresEventStoreTest.java +++ b/thoth-jooq-reactor/src/test/java/fr/maif/eventsourcing/AbstractPostgresEventStoreTest.java @@ -1,7 +1,7 @@ package fr.maif.eventsourcing; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; import fr.maif.eventsourcing.format.JacksonEventFormat; import fr.maif.eventsourcing.format.JacksonSimpleFormat; import fr.maif.jooq.PgAsyncPool; diff --git a/thoth-jooq-reactor/src/test/java/fr/maif/eventsourcing/DefaultReactorAggregateStoreTest.java b/thoth-jooq-reactor/src/test/java/fr/maif/eventsourcing/DefaultReactorAggregateStoreTest.java index 44a80273..375396e1 100644 --- a/thoth-jooq-reactor/src/test/java/fr/maif/eventsourcing/DefaultReactorAggregateStoreTest.java +++ b/thoth-jooq-reactor/src/test/java/fr/maif/eventsourcing/DefaultReactorAggregateStoreTest.java @@ -16,7 +16,7 @@ import static fr.maif.eventsourcing.AbstractPostgresEventStoreTest.eventEnvelope; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Matchers.any; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; diff --git a/thoth-jooq/build.gradle b/thoth-jooq/build.gradle index 1743a4e2..d5133d8c 100644 --- a/thoth-jooq/build.gradle +++ b/thoth-jooq/build.gradle @@ -1,6 +1,6 @@ dependencies { - implementation project(':commons-events') + implementation project(':thoth-commons-events') implementation project(':thoth-core') implementation project(':thoth-core-reactor') implementation("io.vavr:vavr:$vavrVersion") @@ -11,21 +11,17 @@ dependencies { implementation("org.jooq:jooq:$jooqVersion") implementation("javax.annotation:jsr250-api:1.0") implementation("io.vavr:vavr-jackson:$vavrJacksonVersion") - implementation("com.fasterxml.jackson.datatype:jackson-datatype-jdk8:$jacksonVersion") - implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jacksonVersion") testImplementation project(':thoth-tck') - testImplementation("com.typesafe.akka:akka-testkit_$scalaVersion:$akkaVersion") - testImplementation("com.typesafe.akka:akka-stream-testkit_$scalaVersion:$akkaVersion") + testImplementation("org.apache.pekko:pekko-testkit_$scalaVersion:$pekkoVersion") + testImplementation("org.apache.pekko:pekko-stream-testkit_$scalaVersion:$pekkoVersion") testImplementation("com.zaxxer:HikariCP:4.0.3") - testImplementation("org.assertj:assertj-core:3.10.0") + testImplementation("org.assertj:assertj-core:$assertJVersion") testImplementation('com.h2database:h2:2.2.220') - testImplementation("org.junit.platform:junit-platform-launcher:1.4.2") - testImplementation("org.junit.platform:junit-platform-commons:1.4.2") - testImplementation("org.junit.jupiter:junit-jupiter-engine:5.4.2") - testImplementation("org.junit.vintage:junit-vintage-engine:5.4.2") - testImplementation("net.aichler:jupiter-interface:0.9.1") - testImplementation("org.mockito:mockito-core:2.22.0") + testImplementation(platform("org.junit:junit-bom:$jupiterVersion")) + testImplementation("org.junit.jupiter:junit-jupiter") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") + testImplementation("org.mockito:mockito-core:$mockitoCoreVersion") testImplementation('org.testng:testng:7.7.0') testImplementation("org.testcontainers:postgresql:$testContainerVersion") testImplementation("org.testcontainers:kafka:$testContainerVersion") diff --git a/thoth-jooq/src/main/java/fr/maif/eventsourcing/impl/PostgresEventStore.java b/thoth-jooq/src/main/java/fr/maif/eventsourcing/impl/PostgresEventStore.java index 06f44697..aa097843 100644 --- a/thoth-jooq/src/main/java/fr/maif/eventsourcing/impl/PostgresEventStore.java +++ b/thoth-jooq/src/main/java/fr/maif/eventsourcing/impl/PostgresEventStore.java @@ -1,8 +1,8 @@ package fr.maif.eventsourcing.impl; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.NullNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.NullNode; import fr.maif.concurrent.CompletionStages; import fr.maif.eventsourcing.Event; import fr.maif.eventsourcing.EventEnvelope; diff --git a/thoth-jooq/src/test/java/fr/maif/eventsourcing/impl/JooqKafkaTckImplementation.java b/thoth-jooq/src/test/java/fr/maif/eventsourcing/impl/JooqKafkaTckImplementation.java index 0ed0c6b4..04abe040 100644 --- a/thoth-jooq/src/test/java/fr/maif/eventsourcing/impl/JooqKafkaTckImplementation.java +++ b/thoth-jooq/src/test/java/fr/maif/eventsourcing/impl/JooqKafkaTckImplementation.java @@ -15,8 +15,8 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; -import akka.stream.javadsl.Sink; -import akka.stream.javadsl.Source; +import org.apache.pekko.stream.javadsl.Sink; +import org.apache.pekko.stream.javadsl.Source; import fr.maif.eventsourcing.EventStore; import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecord; @@ -33,10 +33,10 @@ import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.ObjectNode; -import akka.actor.ActorSystem; +import org.apache.pekko.actor.ActorSystem; import fr.maif.eventsourcing.EventEnvelope; import fr.maif.eventsourcing.EventProcessorImpl; import fr.maif.eventsourcing.PostgresKafkaEventProcessor; @@ -273,8 +273,6 @@ public EventEnvelope parsEnvelope(String value) { future::complete ); return future.get(); - } catch (IOException e) { - throw new UncheckedIOException(e); } catch (InterruptedException e) { throw new RuntimeException(e); } catch (ExecutionException e) { diff --git a/thoth-jooq/src/test/java/fr/maif/eventsourcing/impl/PostgresEventStoreTest.java b/thoth-jooq/src/test/java/fr/maif/eventsourcing/impl/PostgresEventStoreTest.java index 07e8d21f..ffc6aa74 100644 --- a/thoth-jooq/src/test/java/fr/maif/eventsourcing/impl/PostgresEventStoreTest.java +++ b/thoth-jooq/src/test/java/fr/maif/eventsourcing/impl/PostgresEventStoreTest.java @@ -1,12 +1,12 @@ package fr.maif.eventsourcing.impl; -import akka.NotUsed; -import akka.actor.ActorSystem; -import akka.stream.Materializer; -import akka.stream.javadsl.Sink; -import akka.stream.javadsl.Source; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.pekko.NotUsed; +import org.apache.pekko.actor.ActorSystem; +import org.apache.pekko.stream.Materializer; +import org.apache.pekko.stream.javadsl.Sink; +import org.apache.pekko.stream.javadsl.Source; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import fr.maif.eventsourcing.*; diff --git a/thoth-kafka-consumer-akka/build.gradle b/thoth-kafka-consumer-akka/build.gradle deleted file mode 100644 index 617c392e..00000000 --- a/thoth-kafka-consumer-akka/build.gradle +++ /dev/null @@ -1,22 +0,0 @@ - -dependencies { - implementation("com.typesafe.akka:akka-stream_$scalaVersion:$akkaVersion") - implementation("com.typesafe.akka:akka-stream-kafka_$scalaVersion:$alpakkaKafkaVersion") - - testImplementation("com.typesafe.akka:akka-testkit_$scalaVersion:$akkaVersion") - testImplementation("com.typesafe.akka:akka-stream-testkit_$scalaVersion:$akkaVersion") - testImplementation("com.typesafe.akka:akka-stream-kafka-testkit_$scalaVersion:$alpakkaKafkaVersion") - testImplementation("org.assertj:assertj-core:3.10.0") - testImplementation("org.junit.platform:junit-platform-launcher:1.4.2") - testImplementation("org.junit.platform:junit-platform-commons:1.4.2") - testImplementation("org.junit.jupiter:junit-jupiter-engine:5.4.2") - testImplementation("org.junit.vintage:junit-vintage-engine:5.4.2") - testImplementation("net.aichler:jupiter-interface:0.9.1") - testImplementation("org.scalatest:scalatest_$scalaVersion:3.0.8") - testImplementation("org.testcontainers:kafka:1.15.1") - -} - -test { - useJUnitPlatform() -} \ No newline at end of file diff --git a/thoth-kafka-consumer-pekko/build.gradle b/thoth-kafka-consumer-pekko/build.gradle new file mode 100644 index 00000000..7761ff55 --- /dev/null +++ b/thoth-kafka-consumer-pekko/build.gradle @@ -0,0 +1,24 @@ + +dependencies { + implementation "org.apache.pekko:pekko-actor_$scalaVersion:$pekkoVersion" + implementation "org.apache.pekko:pekko-stream_$scalaVersion:$pekkoVersion" + implementation "org.apache.pekko:pekko-slf4j_$scalaVersion:$pekkoVersion" + implementation "org.apache.pekko:pekko-connectors-kafka_$scalaVersion:$pekkoKafkaVersion" + + testImplementation("org.testcontainers:kafka:$testContainerVersion") + testImplementation("org.testcontainers:junit-jupiter:$testContainerVersion") + testImplementation("org.apache.pekko:pekko-testkit_$scalaVersion:$pekkoVersion") + testImplementation("org.apache.pekko:pekko-stream-testkit_$scalaVersion:$pekkoVersion") + testImplementation "org.apache.pekko:pekko-connectors-kafka-testkit_$scalaVersion:$pekkoKafkaVersion" + testImplementation("org.assertj:assertj-core:$assertJVersion") + testImplementation(platform("org.junit:junit-bom:$jupiterVersion")) + testImplementation("org.junit.jupiter:junit-jupiter") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") + testImplementation("org.scalatest:scalatest_$scalaVersion:3.0.8") + testImplementation("org.testcontainers:kafka:$testContainerVersion") + +} + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/thoth-kafka-consumer-akka/src/main/java/fr/maif/kafka/consumer/ResilientKafkaConsumer.java b/thoth-kafka-consumer-pekko/src/main/java/fr/maif/kafka/consumer/ResilientKafkaConsumer.java similarity index 96% rename from thoth-kafka-consumer-akka/src/main/java/fr/maif/kafka/consumer/ResilientKafkaConsumer.java rename to thoth-kafka-consumer-pekko/src/main/java/fr/maif/kafka/consumer/ResilientKafkaConsumer.java index 4d41ce8a..18bb524c 100644 --- a/thoth-kafka-consumer-akka/src/main/java/fr/maif/kafka/consumer/ResilientKafkaConsumer.java +++ b/thoth-kafka-consumer-pekko/src/main/java/fr/maif/kafka/consumer/ResilientKafkaConsumer.java @@ -1,21 +1,21 @@ package fr.maif.kafka.consumer; -import akka.Done; -import akka.NotUsed; -import akka.actor.ActorSystem; -import akka.japi.Pair; -import akka.kafka.AutoSubscription; -import akka.kafka.CommitterSettings; -import akka.kafka.ConsumerMessage; -import akka.kafka.ConsumerSettings; -import akka.kafka.javadsl.Committer; -import akka.kafka.javadsl.Consumer; -import akka.stream.Materializer; -import akka.stream.javadsl.Flow; -import akka.stream.javadsl.FlowWithContext; -import akka.stream.javadsl.RestartSource; -import akka.stream.javadsl.Sink; -import akka.stream.javadsl.Source; +import org.apache.pekko.Done; +import org.apache.pekko.NotUsed; +import org.apache.pekko.actor.ActorSystem; +import org.apache.pekko.japi.Pair; +import org.apache.pekko.kafka.AutoSubscription; +import org.apache.pekko.kafka.CommitterSettings; +import org.apache.pekko.kafka.ConsumerMessage; +import org.apache.pekko.kafka.ConsumerSettings; +import org.apache.pekko.kafka.javadsl.Committer; +import org.apache.pekko.kafka.javadsl.Consumer; +import org.apache.pekko.stream.Materializer; +import org.apache.pekko.stream.javadsl.Flow; +import org.apache.pekko.stream.javadsl.FlowWithContext; +import org.apache.pekko.stream.javadsl.RestartSource; +import org.apache.pekko.stream.javadsl.Sink; +import org.apache.pekko.stream.javadsl.Source; import org.apache.kafka.clients.consumer.ConsumerConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,7 +33,7 @@ import java.util.function.Function; import java.util.function.Supplier; -import static akka.Done.done; +import static org.apache.pekko.Done.done; import static java.util.function.Function.identity; public abstract class ResilientKafkaConsumer { diff --git a/thoth-kafka-consumer-akka/src/main/java/fr/maif/kafka/consumer/Status.java b/thoth-kafka-consumer-pekko/src/main/java/fr/maif/kafka/consumer/Status.java similarity index 100% rename from thoth-kafka-consumer-akka/src/main/java/fr/maif/kafka/consumer/Status.java rename to thoth-kafka-consumer-pekko/src/main/java/fr/maif/kafka/consumer/Status.java diff --git a/thoth-kafka-consumer-pekko/src/test/java/fr/maif/kafka/consumer/KafkaContainerTest.java b/thoth-kafka-consumer-pekko/src/test/java/fr/maif/kafka/consumer/KafkaContainerTest.java new file mode 100644 index 00000000..618c4f8a --- /dev/null +++ b/thoth-kafka-consumer-pekko/src/test/java/fr/maif/kafka/consumer/KafkaContainerTest.java @@ -0,0 +1,94 @@ +package fr.maif.kafka.consumer; + +import org.apache.kafka.clients.admin.Admin; +import org.apache.kafka.clients.admin.AdminClientConfig; +import org.apache.kafka.clients.admin.CreateTopicsResult; +import org.apache.kafka.clients.admin.NewTopic; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerConfig; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.common.serialization.StringSerializer; +import org.testcontainers.containers.KafkaContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.utility.DockerImageName; + +import java.util.Map; +import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.concurrent.atomic.AtomicInteger; + + +@Testcontainers +public interface KafkaContainerTest { + + AtomicInteger counter = new AtomicInteger(0); + + @Container + KafkaContainer kafkaContainer = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:7.4.0")) + .withStartupAttempts(2); + + static void startContainer() { + kafkaContainer.start(); + } + + default String bootstrapServers() { + return kafkaContainer.getBootstrapServers(); + } + + default Admin adminClient() { + return Admin.create(Map.of( + AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaContainer.getBootstrapServers() + )); + } + + default String createTopic() { + return createTopic("topic-"+counter.incrementAndGet(), 3, 1); + } + + default String createTopic(String name, int partitions, int replication) { + try { + CreateTopicsResult createTopicsResult = adminClient().createTopics(java.util.List.of(new NewTopic(name, partitions, (short) replication))); + createTopicsResult.all().get(10, TimeUnit.SECONDS); + } catch (InterruptedException | ExecutionException | TimeoutException e) { + throw new RuntimeException("Unable to create topic with name " + name, e); + } + return name; + } + + default void deleteTopics() { + try { + Set topics = adminClient().listTopics().names().get(5, TimeUnit.SECONDS); + if (!topics.isEmpty()) { + System.out.println("Deleting " + String.join(",", topics)); + adminClient().deleteTopics(topics).all().get(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + default KafkaProducer producer() { + return new KafkaProducer<>(Map.of( + ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaContainer.getBootstrapServers() + ), new StringSerializer(), new StringSerializer()); + } + + default void produceString(String topic, String event) { + CompletableFuture completableFuture = new CompletableFuture<>(); + producer().send(new ProducerRecord<>( + topic, event + ), (recordMetadata, e) -> { + if (e != null) { + completableFuture.completeExceptionally(e); + } else { + completableFuture.complete(recordMetadata.topic()); + } + }); + completableFuture.join(); + } + +} diff --git a/thoth-kafka-consumer-akka/src/test/java/fr/maif/kafka/consumer/ResilientKafkaConsumerTest.java b/thoth-kafka-consumer-pekko/src/test/java/fr/maif/kafka/consumer/ResilientKafkaConsumerTest.java similarity index 86% rename from thoth-kafka-consumer-akka/src/test/java/fr/maif/kafka/consumer/ResilientKafkaConsumerTest.java rename to thoth-kafka-consumer-pekko/src/test/java/fr/maif/kafka/consumer/ResilientKafkaConsumerTest.java index 469fd4ec..77d04b53 100644 --- a/thoth-kafka-consumer-akka/src/test/java/fr/maif/kafka/consumer/ResilientKafkaConsumerTest.java +++ b/thoth-kafka-consumer-pekko/src/test/java/fr/maif/kafka/consumer/ResilientKafkaConsumerTest.java @@ -1,16 +1,15 @@ package fr.maif.kafka.consumer; -import akka.Done; -import akka.actor.ActorSystem; -import akka.kafka.ConsumerMessage.CommittableMessage; -import akka.kafka.ConsumerMessage.CommittableOffset; -import akka.kafka.ConsumerSettings; -import akka.kafka.Subscriptions; -import akka.kafka.testkit.javadsl.TestcontainersKafkaTest; -import akka.stream.Materializer; -import akka.stream.javadsl.Flow; -import akka.stream.javadsl.FlowWithContext; -import akka.testkit.javadsl.TestKit; +import org.apache.pekko.Done; +import org.apache.pekko.actor.ActorSystem; +import org.apache.pekko.kafka.ConsumerMessage.CommittableMessage; +import org.apache.pekko.kafka.ConsumerMessage.CommittableOffset; +import org.apache.pekko.kafka.ConsumerSettings; +import org.apache.pekko.kafka.Subscriptions; +import org.apache.pekko.stream.Materializer; +import org.apache.pekko.stream.javadsl.Flow; +import org.apache.pekko.stream.javadsl.FlowWithContext; +import org.apache.pekko.testkit.javadsl.TestKit; import org.apache.kafka.common.serialization.StringDeserializer; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Test; @@ -26,13 +25,9 @@ import static org.assertj.core.api.Assertions.assertThat; @TestInstance(TestInstance.Lifecycle.PER_CLASS) -class ResilientKafkaConsumerTest extends TestcontainersKafkaTest { +class ResilientKafkaConsumerTest implements KafkaContainerTest { private static final ActorSystem system = ActorSystem.create("test"); - public ResilientKafkaConsumerTest() { - super(system, Materializer.createMaterializer(system)); - } - @Test void consumer() throws Exception { @@ -61,9 +56,9 @@ void consumer() throws Exception { Thread.sleep(3000); - resultOf(produceString(topic, "event-1")); - resultOf(produceString(topic, "event-2")); - resultOf(produceString(topic, "event-3")); + produceString(topic, "event-1"); + produceString(topic, "event-2"); + produceString(topic, "event-3"); Thread.sleep(10000); @@ -76,7 +71,7 @@ void consumer() throws Exception { @Test void contexteAkkastreamApi() throws Exception { - String topic = createTopic(); + String topic = createTopic("topic-"+counter.incrementAndGet(), 1, 1); String groupId = "test-group-id-3"; AtomicReference names = new AtomicReference<>(""); @@ -95,15 +90,16 @@ void contexteAkkastreamApi() throws Exception { .grouped(3) .map(messages -> { String collectedMessages = messages.stream().map(m -> m.record().value()).collect(Collectors.joining(" ")); + System.out.println(collectedMessages); names.set(collectedMessages); return Done.done(); }) ); Thread.sleep(3000); - resultOf(produceString(topic, "event-1")); - resultOf(produceString(topic, "event-2")); - resultOf(produceString(topic, "event-3")); + produceString(topic, "event-1"); + produceString(topic, "event-2"); + produceString(topic, "event-3"); Thread.sleep(10000); @@ -117,7 +113,7 @@ void contexteAkkastreamApi() throws Exception { @Test void crash() throws Exception { - String topic = createTopic(); + String topic = createTopic("topic-"+counter.incrementAndGet(), 1, 1); String groupId = "test-group-id-3"; AtomicReference names = new AtomicReference<>(""); @@ -152,9 +148,9 @@ void crash() throws Exception { ); Thread.sleep(4000); - resultOf(produceString(topic, "event-1")); - resultOf(produceString(topic, "event-2")); - resultOf(produceString(topic, "event-3")); + produceString(topic, "event-1"); + produceString(topic, "event-2"); + produceString(topic, "event-3"); Thread.sleep(60000); @@ -222,9 +218,9 @@ void consumerLifecycle() throws Exception { assertThat(resilientKafkaConsumer.status()).isIn(Status.Started); assertThat(isStarted.get()).isTrue(); - resultOf(produceString(topic, "event-1")); - resultOf(produceString(topic, "event-2")); - resultOf(produceString(topic, "event-3")); + produceString(topic, "event-1"); + produceString(topic, "event-2"); + produceString(topic, "event-3"); Thread.sleep(10000); diff --git a/thoth-kafka-consumer-reactor/build.gradle b/thoth-kafka-consumer-reactor/build.gradle index 3c4a8992..f254e6a5 100644 --- a/thoth-kafka-consumer-reactor/build.gradle +++ b/thoth-kafka-consumer-reactor/build.gradle @@ -3,20 +3,18 @@ dependencies { implementation "io.projectreactor.kafka:reactor-kafka:$reactorKafkaVersion" implementation "io.vavr:vavr:$vavrVersion" implementation('org.slf4j:slf4j-api:2.0.7') - - testImplementation("com.typesafe.akka:akka-stream_$scalaVersion:$akkaVersion") - testImplementation("com.typesafe.akka:akka-stream-kafka_$scalaVersion:$alpakkaKafkaVersion") - testImplementation("com.typesafe.akka:akka-testkit_$scalaVersion:$akkaVersion") - testImplementation("com.typesafe.akka:akka-stream-testkit_$scalaVersion:$akkaVersion") - testImplementation("com.typesafe.akka:akka-stream-kafka-testkit_$scalaVersion:$alpakkaKafkaVersion") - testImplementation("org.assertj:assertj-core:3.10.0") - testImplementation("org.junit.platform:junit-platform-launcher:1.4.2") - testImplementation("org.junit.platform:junit-platform-commons:1.4.2") - testImplementation("org.junit.jupiter:junit-jupiter-engine:5.4.2") - testImplementation("org.junit.vintage:junit-vintage-engine:5.4.2") - testImplementation("net.aichler:jupiter-interface:0.9.1") + testImplementation("org.apache.pekko:pekko-actor_$scalaVersion:$pekkoVersion") + testImplementation("org.apache.pekko:pekko-stream_$scalaVersion:$pekkoVersion") + testImplementation("org.apache.pekko:pekko-testkit_$scalaVersion:$pekkoVersion") + testImplementation("org.apache.pekko:pekko-stream-testkit_$scalaVersion:$pekkoVersion") + testImplementation "org.apache.pekko:pekko-connectors-kafka-testkit_$scalaVersion:$pekkoKafkaVersion" + testImplementation("org.assertj:assertj-core:$assertJVersion") + testImplementation(platform("org.junit:junit-bom:$jupiterVersion")) + testImplementation("org.junit.jupiter:junit-jupiter") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") testImplementation("org.scalatest:scalatest_$scalaVersion:3.0.8") - testImplementation("org.testcontainers:kafka:1.15.1") + testImplementation("org.testcontainers:kafka:$testContainerVersion") + testImplementation("org.testcontainers:junit-jupiter:$testContainerVersion") testImplementation 'ch.qos.logback:logback-classic:1.4.1' } diff --git a/thoth-kafka-consumer-reactor/src/test/java/fr/maif/kafka/consumer/KafkaContainerTest.java b/thoth-kafka-consumer-reactor/src/test/java/fr/maif/kafka/consumer/KafkaContainerTest.java new file mode 100644 index 00000000..618c4f8a --- /dev/null +++ b/thoth-kafka-consumer-reactor/src/test/java/fr/maif/kafka/consumer/KafkaContainerTest.java @@ -0,0 +1,94 @@ +package fr.maif.kafka.consumer; + +import org.apache.kafka.clients.admin.Admin; +import org.apache.kafka.clients.admin.AdminClientConfig; +import org.apache.kafka.clients.admin.CreateTopicsResult; +import org.apache.kafka.clients.admin.NewTopic; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerConfig; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.common.serialization.StringSerializer; +import org.testcontainers.containers.KafkaContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.utility.DockerImageName; + +import java.util.Map; +import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.concurrent.atomic.AtomicInteger; + + +@Testcontainers +public interface KafkaContainerTest { + + AtomicInteger counter = new AtomicInteger(0); + + @Container + KafkaContainer kafkaContainer = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:7.4.0")) + .withStartupAttempts(2); + + static void startContainer() { + kafkaContainer.start(); + } + + default String bootstrapServers() { + return kafkaContainer.getBootstrapServers(); + } + + default Admin adminClient() { + return Admin.create(Map.of( + AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaContainer.getBootstrapServers() + )); + } + + default String createTopic() { + return createTopic("topic-"+counter.incrementAndGet(), 3, 1); + } + + default String createTopic(String name, int partitions, int replication) { + try { + CreateTopicsResult createTopicsResult = adminClient().createTopics(java.util.List.of(new NewTopic(name, partitions, (short) replication))); + createTopicsResult.all().get(10, TimeUnit.SECONDS); + } catch (InterruptedException | ExecutionException | TimeoutException e) { + throw new RuntimeException("Unable to create topic with name " + name, e); + } + return name; + } + + default void deleteTopics() { + try { + Set topics = adminClient().listTopics().names().get(5, TimeUnit.SECONDS); + if (!topics.isEmpty()) { + System.out.println("Deleting " + String.join(",", topics)); + adminClient().deleteTopics(topics).all().get(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + default KafkaProducer producer() { + return new KafkaProducer<>(Map.of( + ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaContainer.getBootstrapServers() + ), new StringSerializer(), new StringSerializer()); + } + + default void produceString(String topic, String event) { + CompletableFuture completableFuture = new CompletableFuture<>(); + producer().send(new ProducerRecord<>( + topic, event + ), (recordMetadata, e) -> { + if (e != null) { + completableFuture.completeExceptionally(e); + } else { + completableFuture.complete(recordMetadata.topic()); + } + }); + completableFuture.join(); + } + +} diff --git a/thoth-kafka-consumer-reactor/src/test/java/fr/maif/kafka/consumer/ResilientKafkaConsumerTest.java b/thoth-kafka-consumer-reactor/src/test/java/fr/maif/kafka/consumer/ResilientKafkaConsumerTest.java index 83f18eef..7adbd93a 100644 --- a/thoth-kafka-consumer-reactor/src/test/java/fr/maif/kafka/consumer/ResilientKafkaConsumerTest.java +++ b/thoth-kafka-consumer-reactor/src/test/java/fr/maif/kafka/consumer/ResilientKafkaConsumerTest.java @@ -1,13 +1,11 @@ package fr.maif.kafka.consumer; -import akka.actor.ActorSystem; -import akka.kafka.testkit.javadsl.TestcontainersKafkaTest; -import akka.stream.Materializer; -import akka.testkit.javadsl.TestKit; import fr.maif.kafka.reactor.consumer.ResilientKafkaConsumer; import fr.maif.kafka.reactor.consumer.Status; import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.common.serialization.StringDeserializer; +import org.apache.pekko.actor.ActorSystem; +import org.apache.pekko.testkit.javadsl.TestKit; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -26,14 +24,10 @@ import static org.assertj.core.api.Assertions.assertThat; @TestInstance(TestInstance.Lifecycle.PER_CLASS) -class ResilientKafkaConsumerTest extends TestcontainersKafkaTest { +class ResilientKafkaConsumerTest implements KafkaContainerTest { private static final ActorSystem system = ActorSystem.create("test"); private ReceiverOptions receiverOptions; - public ResilientKafkaConsumerTest() { - super(system, Materializer.createMaterializer(system)); - } - @BeforeEach public void init() { Map props = new HashMap<>(); @@ -69,9 +63,9 @@ void consumer() throws Exception { Thread.sleep(3000); - resultOf(produceString(topic, "event-1")); - resultOf(produceString(topic, "event-2")); - resultOf(produceString(topic, "event-3")); + produceString(topic, "event-1"); + produceString(topic, "event-2"); + produceString(topic, "event-3"); Thread.sleep(10000); @@ -110,9 +104,9 @@ void crash() throws Exception { ); Thread.sleep(4000); - resultOf(produceString(topic, "event-1")); - resultOf(produceString(topic, "event-2")); - resultOf(produceString(topic, "event-3")); + produceString(topic, "event-1"); + produceString(topic, "event-2"); + produceString(topic, "event-3"); Thread.sleep(60000); @@ -171,9 +165,9 @@ void consumerLifecycle() throws Exception { assertThat(resilientKafkaConsumer.status()).isIn(Status.Started); assertThat(isStarted.get()).isTrue(); - resultOf(produceString(topic, "event-1")); - resultOf(produceString(topic, "event-2")); - resultOf(produceString(topic, "event-3")); + produceString(topic, "event-1"); + produceString(topic, "event-2"); + produceString(topic, "event-3"); Thread.sleep(10000); diff --git a/sample/.gitignore b/thoth-sample/.gitignore similarity index 100% rename from sample/.gitignore rename to thoth-sample/.gitignore diff --git a/sample/Thoth.postman_collection.json b/thoth-sample/Thoth.postman_collection.json similarity index 100% rename from sample/Thoth.postman_collection.json rename to thoth-sample/Thoth.postman_collection.json diff --git a/sample/build.gradle b/thoth-sample/build.gradle similarity index 69% rename from sample/build.gradle rename to thoth-sample/build.gradle index 07ca049c..b00b0d40 100644 --- a/sample/build.gradle +++ b/thoth-sample/build.gradle @@ -3,23 +3,22 @@ tasks.withType(PublishToMavenRepository).configureEach { it.enabled = false } //project.tasks.publishToSonatype.enabled = false ext { - vavrVersion = "0.10.6" - jacksonVersion = "2.18.4" - lombokVersion = "1.18.38" - jupiterVersion = "5.13.1" + springBootVersion = "4.0.5" } dependencies { - implementation project(':commons-events') + implementation project(':thoth-commons-events') implementation project(':thoth-core') implementation project(':thoth-core-reactor') implementation project(':thoth-jooq') implementation project(':thoth-kafka-consumer-reactor') implementation("io.vavr:vavr:$vavrVersion") implementation("fr.maif:functional-json:$functionalJsonVersion") - implementation("org.springframework.boot:spring-boot-starter:3.4.5") - implementation("org.springframework.boot:spring-boot-starter-web:3.4.5") + implementation("org.springframework.boot:spring-boot-starter:$springBootVersion") + implementation("org.springframework.boot:spring-boot-starter-web:$springBootVersion") + implementation("org.springframework.boot:spring-boot-starter-jooq:$springBootVersion") + implementation("org.springframework.boot:spring-boot-starter-restclient:$springBootVersion") implementation('org.postgresql:postgresql:42.7.7') implementation("io.projectreactor:reactor-core:$reactorVersion") implementation "io.projectreactor.kafka:reactor-kafka:$reactorKafkaVersion" @@ -31,8 +30,10 @@ dependencies { testImplementation("org.testcontainers:postgresql:$testContainerVersion") testImplementation("org.testcontainers:kafka:$testContainerVersion") testImplementation("org.testcontainers:junit-jupiter:$testContainerVersion") - testImplementation("org.springframework.boot:spring-boot-starter-test:3.4.5") - testImplementation("org.assertj:assertj-core:3.19.0") + testImplementation("org.springframework.boot:spring-boot-starter-test:$springBootVersion") + testImplementation("org.springframework.boot:spring-boot-starter-restclient-test:$springBootVersion") + testImplementation("org.springframework.boot:spring-boot-resttestclient:$springBootVersion") + testImplementation("org.assertj:assertj-core:$assertJVersion") } diff --git a/sample/docker-compose-kafka.yml b/thoth-sample/docker-compose-kafka.yml similarity index 100% rename from sample/docker-compose-kafka.yml rename to thoth-sample/docker-compose-kafka.yml diff --git a/sample/docker-compose-postgres.yml b/thoth-sample/docker-compose-postgres.yml similarity index 100% rename from sample/docker-compose-postgres.yml rename to thoth-sample/docker-compose-postgres.yml diff --git a/sample/init.sql b/thoth-sample/init.sql similarity index 100% rename from sample/init.sql rename to thoth-sample/init.sql diff --git a/sample/src/main/java/fr/maif/thoth/sample/ThothSampleApplication.java b/thoth-sample/src/main/java/fr/maif/thoth/sample/ThothSampleApplication.java similarity index 85% rename from sample/src/main/java/fr/maif/thoth/sample/ThothSampleApplication.java rename to thoth-sample/src/main/java/fr/maif/thoth/sample/ThothSampleApplication.java index 0f525e76..030d5d1f 100644 --- a/sample/src/main/java/fr/maif/thoth/sample/ThothSampleApplication.java +++ b/thoth-sample/src/main/java/fr/maif/thoth/sample/ThothSampleApplication.java @@ -2,7 +2,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration; +import org.springframework.boot.jooq.autoconfigure.JooqAutoConfiguration; @SpringBootApplication(exclude = JooqAutoConfiguration.class) public class ThothSampleApplication { diff --git a/sample/src/main/java/fr/maif/thoth/sample/api/AccountDTO.java b/thoth-sample/src/main/java/fr/maif/thoth/sample/api/AccountDTO.java similarity index 100% rename from sample/src/main/java/fr/maif/thoth/sample/api/AccountDTO.java rename to thoth-sample/src/main/java/fr/maif/thoth/sample/api/AccountDTO.java diff --git a/sample/src/main/java/fr/maif/thoth/sample/api/BalanceDTO.java b/thoth-sample/src/main/java/fr/maif/thoth/sample/api/BalanceDTO.java similarity index 100% rename from sample/src/main/java/fr/maif/thoth/sample/api/BalanceDTO.java rename to thoth-sample/src/main/java/fr/maif/thoth/sample/api/BalanceDTO.java diff --git a/sample/src/main/java/fr/maif/thoth/sample/api/BankController.java b/thoth-sample/src/main/java/fr/maif/thoth/sample/api/BankController.java similarity index 100% rename from sample/src/main/java/fr/maif/thoth/sample/api/BankController.java rename to thoth-sample/src/main/java/fr/maif/thoth/sample/api/BankController.java diff --git a/sample/src/main/java/fr/maif/thoth/sample/api/TransferDTO.java b/thoth-sample/src/main/java/fr/maif/thoth/sample/api/TransferDTO.java similarity index 100% rename from sample/src/main/java/fr/maif/thoth/sample/api/TransferDTO.java rename to thoth-sample/src/main/java/fr/maif/thoth/sample/api/TransferDTO.java diff --git a/sample/src/main/java/fr/maif/thoth/sample/api/TransferResultDTO.java b/thoth-sample/src/main/java/fr/maif/thoth/sample/api/TransferResultDTO.java similarity index 100% rename from sample/src/main/java/fr/maif/thoth/sample/api/TransferResultDTO.java rename to thoth-sample/src/main/java/fr/maif/thoth/sample/api/TransferResultDTO.java diff --git a/sample/src/main/java/fr/maif/thoth/sample/commands/BankCommand.java b/thoth-sample/src/main/java/fr/maif/thoth/sample/commands/BankCommand.java similarity index 100% rename from sample/src/main/java/fr/maif/thoth/sample/commands/BankCommand.java rename to thoth-sample/src/main/java/fr/maif/thoth/sample/commands/BankCommand.java diff --git a/sample/src/main/java/fr/maif/thoth/sample/commands/BankCommandHandler.java b/thoth-sample/src/main/java/fr/maif/thoth/sample/commands/BankCommandHandler.java similarity index 100% rename from sample/src/main/java/fr/maif/thoth/sample/commands/BankCommandHandler.java rename to thoth-sample/src/main/java/fr/maif/thoth/sample/commands/BankCommandHandler.java diff --git a/sample/src/main/java/fr/maif/thoth/sample/configuration/BankConfiguration.java b/thoth-sample/src/main/java/fr/maif/thoth/sample/configuration/BankConfiguration.java similarity index 100% rename from sample/src/main/java/fr/maif/thoth/sample/configuration/BankConfiguration.java rename to thoth-sample/src/main/java/fr/maif/thoth/sample/configuration/BankConfiguration.java diff --git a/sample/src/main/java/fr/maif/thoth/sample/events/BankEvent.java b/thoth-sample/src/main/java/fr/maif/thoth/sample/events/BankEvent.java similarity index 100% rename from sample/src/main/java/fr/maif/thoth/sample/events/BankEvent.java rename to thoth-sample/src/main/java/fr/maif/thoth/sample/events/BankEvent.java diff --git a/sample/src/main/java/fr/maif/thoth/sample/events/BankEventFormat.java b/thoth-sample/src/main/java/fr/maif/thoth/sample/events/BankEventFormat.java similarity index 96% rename from sample/src/main/java/fr/maif/thoth/sample/events/BankEventFormat.java rename to thoth-sample/src/main/java/fr/maif/thoth/sample/events/BankEventFormat.java index 3e8a48b1..2f8dbf92 100644 --- a/sample/src/main/java/fr/maif/thoth/sample/events/BankEventFormat.java +++ b/thoth-sample/src/main/java/fr/maif/thoth/sample/events/BankEventFormat.java @@ -2,8 +2,8 @@ import static io.vavr.API.Case; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import fr.maif.eventsourcing.format.JacksonEventFormat; import fr.maif.json.Json; import fr.maif.json.JsonWrite; diff --git a/sample/src/main/java/fr/maif/thoth/sample/events/BankEventHandler.java b/thoth-sample/src/main/java/fr/maif/thoth/sample/events/BankEventHandler.java similarity index 100% rename from sample/src/main/java/fr/maif/thoth/sample/events/BankEventHandler.java rename to thoth-sample/src/main/java/fr/maif/thoth/sample/events/BankEventHandler.java diff --git a/sample/src/main/java/fr/maif/thoth/sample/projections/eventualyconsistent/MeanWithdrawProjection.java b/thoth-sample/src/main/java/fr/maif/thoth/sample/projections/eventualyconsistent/MeanWithdrawProjection.java similarity index 100% rename from sample/src/main/java/fr/maif/thoth/sample/projections/eventualyconsistent/MeanWithdrawProjection.java rename to thoth-sample/src/main/java/fr/maif/thoth/sample/projections/eventualyconsistent/MeanWithdrawProjection.java diff --git a/sample/src/main/java/fr/maif/thoth/sample/projections/transactional/GlobalBalanceProjection.java b/thoth-sample/src/main/java/fr/maif/thoth/sample/projections/transactional/GlobalBalanceProjection.java similarity index 100% rename from sample/src/main/java/fr/maif/thoth/sample/projections/transactional/GlobalBalanceProjection.java rename to thoth-sample/src/main/java/fr/maif/thoth/sample/projections/transactional/GlobalBalanceProjection.java diff --git a/sample/src/main/java/fr/maif/thoth/sample/state/Account.java b/thoth-sample/src/main/java/fr/maif/thoth/sample/state/Account.java similarity index 100% rename from sample/src/main/java/fr/maif/thoth/sample/state/Account.java rename to thoth-sample/src/main/java/fr/maif/thoth/sample/state/Account.java diff --git a/sample/src/main/resources/application.properties b/thoth-sample/src/main/resources/application.properties similarity index 100% rename from sample/src/main/resources/application.properties rename to thoth-sample/src/main/resources/application.properties diff --git a/sample/src/test/java/fr/maif/thoth/sample/ThothSampleApplicationTests.java b/thoth-sample/src/test/java/fr/maif/thoth/sample/ThothSampleApplicationTests.java similarity index 90% rename from sample/src/test/java/fr/maif/thoth/sample/ThothSampleApplicationTests.java rename to thoth-sample/src/test/java/fr/maif/thoth/sample/ThothSampleApplicationTests.java index 006fa951..d6bac90f 100644 --- a/sample/src/test/java/fr/maif/thoth/sample/ThothSampleApplicationTests.java +++ b/thoth-sample/src/test/java/fr/maif/thoth/sample/ThothSampleApplicationTests.java @@ -1,8 +1,5 @@ package fr.maif.thoth.sample; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; import fr.maif.eventsourcing.EventEnvelope; import fr.maif.eventsourcing.format.JacksonSimpleFormat; import fr.maif.json.EventEnvelopeJson; @@ -23,8 +20,9 @@ import org.junit.jupiter.api.*; import org.postgresql.ds.PGSimpleDataSource; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureTestRestTemplate; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.resttestclient.TestRestTemplate; import org.springframework.http.HttpMethod; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.DynamicPropertyRegistry; @@ -35,9 +33,9 @@ import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; import org.testcontainers.utility.DockerImageName; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.ObjectNode; -import java.io.IOException; -import java.io.UncheckedIOException; import java.math.BigDecimal; import java.sql.SQLException; import java.time.Duration; @@ -51,6 +49,7 @@ @ActiveProfiles("test") @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @TestInstance(TestInstance.Lifecycle.PER_CLASS) +@AutoConfigureTestRestTemplate @Testcontainers public class ThothSampleApplicationTests { @@ -63,9 +62,9 @@ public class ThothSampleApplicationTests { private BankEventFormat eventFormat; @Container - private static PostgreSQLContainer postgres = new PostgreSQLContainer<>(DockerImageName.parse("postgres").withTag("11.2")); + private static final PostgreSQLContainer postgres = new PostgreSQLContainer<>(DockerImageName.parse("postgres").withTag("11.2")); @Container - private static KafkaContainer kafka = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka").withTag("6.0.1")); + private static final KafkaContainer kafka = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka").withTag("6.0.1")); private PGSimpleDataSource pgDataSource; static { @@ -320,11 +319,7 @@ private AccountDTO readAccount(String id) { try { return restTemplate.getForEntity("/bank/api/" + id, AccountDTO.class).getBody(); } catch(HttpClientErrorException ex) { - try { - return mapper.readValue(ex.getResponseBodyAsString(), AccountDTO.class); - } catch (IOException e) { - throw ex; - } + return mapper.readValue(ex.getResponseBodyAsString(), AccountDTO.class); } } @@ -332,11 +327,7 @@ private AccountDTO createAccount(AccountDTO account) { try { return restTemplate.postForEntity("/bank/api/", account, AccountDTO.class).getBody(); } catch(HttpClientErrorException ex) { - try { - return mapper.readValue(ex.getResponseBodyAsString(), AccountDTO.class); - } catch (IOException e) { - throw ex; - } + return mapper.readValue(ex.getResponseBodyAsString(), AccountDTO.class); } } @@ -346,18 +337,10 @@ private Optional closeAccount(String id) { if(Objects.isNull(body)) { return Optional.empty(); } else { - try { - return Optional.ofNullable(mapper.readValue(body, AccountDTO.class).error); - } catch (JsonProcessingException e) { - return Optional.empty(); - } + return Optional.ofNullable(mapper.readValue(body, AccountDTO.class).error); } } catch(HttpClientErrorException ex) { - try { - return Optional.ofNullable(mapper.readValue(ex.getResponseBodyAsString(), AccountDTO.class).error); - } catch (IOException e) { - throw ex; - } + return Optional.ofNullable(mapper.readValue(ex.getResponseBodyAsString(), AccountDTO.class).error); } } @@ -367,11 +350,7 @@ private AccountDTO withdraw(String id, BigDecimal amount) { try { return restTemplate.postForEntity("/bank/api/" + id + "/_action/withdraw", request, AccountDTO.class).getBody(); } catch(HttpClientErrorException ex) { - try { - return mapper.readValue(ex.getResponseBodyAsString(), AccountDTO.class); - } catch (IOException e) { - throw ex; - } + return mapper.readValue(ex.getResponseBodyAsString(), AccountDTO.class); } } @@ -381,11 +360,7 @@ private AccountDTO deposit(String id, BigDecimal amount) { try { return restTemplate.postForEntity("/bank/api/" + id + "/_action/deposit", request, AccountDTO.class).getBody(); } catch(HttpClientErrorException ex) { - try { - return mapper.readValue(ex.getResponseBodyAsString(), AccountDTO.class); - } catch (IOException e) { - throw ex; - } + return mapper.readValue(ex.getResponseBodyAsString(), AccountDTO.class); } } @@ -399,11 +374,7 @@ private TransferResultDTO transfer(String source, String target, BigDecimal amou try { return restTemplate.postForEntity("/bank/api/_action/transfer", request, TransferResultDTO.class).getBody(); } catch(HttpClientErrorException ex) { - try { - return mapper.readValue(ex.getResponseBodyAsString(), TransferResultDTO.class); - } catch (IOException e) { - throw ex; - } + return mapper.readValue(ex.getResponseBodyAsString(), TransferResultDTO.class); } } @@ -509,8 +480,6 @@ public EventEnvelope parsEnvelope(String value) { future::complete ); return future.get(); - } catch (IOException e) { - throw new UncheckedIOException(e); } catch (InterruptedException e) { throw new RuntimeException(e); } catch (ExecutionException e) { diff --git a/thoth-tck/build.gradle b/thoth-tck/build.gradle index 6667f47a..603b4eff 100644 --- a/thoth-tck/build.gradle +++ b/thoth-tck/build.gradle @@ -1,17 +1,17 @@ dependencies { - implementation project(':commons-events') + implementation project(':thoth-commons-events') implementation project(':thoth-core') - implementation("org.assertj:assertj-core:3.10.0") - implementation("org.testng:testng:6.3") + implementation("org.assertj:assertj-core:$assertJVersion") + implementation('org.testng:testng:7.7.0') implementation("io.vavr:vavr:$vavrVersion") implementation("fr.maif:functional-json:$functionalJsonVersion") - implementation("com.fasterxml.jackson.datatype:jackson-datatype-jdk8:$jacksonVersion") - implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jacksonVersion") + implementation("tools.jackson.core:jackson-databind:$jacksonVersion") + implementation("com.fasterxml.jackson.core:jackson-annotations:2.21") - testImplementation project(':thoth-core-akka') - testImplementation("com.typesafe.akka:akka-stream_$scalaVersion:$akkaVersion") - testImplementation("org.mockito:mockito-core:3.6.28") + testImplementation project(':thoth-core-pekko') + testImplementation("org.apache.pekko:pekko-stream_$scalaVersion:$pekkoVersion") + testImplementation("org.mockito:mockito-core:$mockitoCoreVersion") } test { @@ -20,4 +20,3 @@ test { suites 'src/test/resources/testng.xml' //location of our suite.xml } } - diff --git a/thoth-tck/src/main/java/fr/maif/eventsourcing/datastore/TestEventFormat.java b/thoth-tck/src/main/java/fr/maif/eventsourcing/datastore/TestEventFormat.java index 8182a191..a92aedff 100644 --- a/thoth-tck/src/main/java/fr/maif/eventsourcing/datastore/TestEventFormat.java +++ b/thoth-tck/src/main/java/fr/maif/eventsourcing/datastore/TestEventFormat.java @@ -1,6 +1,6 @@ package fr.maif.eventsourcing.datastore; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import fr.maif.eventsourcing.format.JacksonEventFormat; import fr.maif.json.Json; import fr.maif.json.JsonWrite; diff --git a/thoth-tck/src/test/java/fr/maif/eventsourcing/datastore/InMemoryDataStoreTest.java b/thoth-tck/src/test/java/fr/maif/eventsourcing/datastore/InMemoryDataStoreTest.java index 70db1dac..1f9f1979 100644 --- a/thoth-tck/src/test/java/fr/maif/eventsourcing/datastore/InMemoryDataStoreTest.java +++ b/thoth-tck/src/test/java/fr/maif/eventsourcing/datastore/InMemoryDataStoreTest.java @@ -5,14 +5,14 @@ import java.util.concurrent.ExecutionException; import java.util.function.Function; -import akka.stream.javadsl.Source; +import org.apache.pekko.stream.javadsl.Source; import fr.maif.akka.eventsourcing.DefaultAggregateStore; import fr.maif.eventsourcing.*; import org.mockito.Mockito; import org.testng.annotations.BeforeMethod; -import akka.actor.ActorSystem; -import akka.stream.javadsl.Sink; +import org.apache.pekko.actor.ActorSystem; +import org.apache.pekko.stream.javadsl.Sink; import fr.maif.akka.eventsourcing.InMemoryEventStore; import io.vavr.Tuple; import io.vavr.Tuple0;