Нет описания

AkkaStreamComponents.scala 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package fr.natan.akkastreamfileprocessingapi.service
  2. import akka.actor.ActorSystem
  3. import akka.stream.alpakka.csv.scaladsl.{CsvParsing, CsvToMap}
  4. import akka.stream.scaladsl.{Compression, FileIO, Flow, Sink, Source}
  5. import akka.{Done, NotUsed}
  6. import com.typesafe.scalalogging.slf4j.Logger
  7. import fr.natan.akkastreamfileprocessingapi.businessexceptions.FileNotFoundException
  8. import fr.natan.akkastreamfileprocessingapi.models.Models.{Person, TvSeries}
  9. import fr.natan.akkastreamfileprocessingapi.valitator.Validators.fileExists
  10. import fr.natan.akkastreamfileprocessingapi.models.ModelsBuilder.{buildPersonModel, buildTvSerieModel}
  11. import java.io.File
  12. import java.nio.file.Paths
  13. import java.util
  14. import scala.concurrent.Future
  15. object AkkaStreamComponents {
  16. implicit val actor: ActorSystem = ActorSystem("AkkaStreamActor")
  17. //flows building
  18. //flow1
  19. def buildPersonFlow(): Flow[Map[String, String], Person, NotUsed] = {
  20. val personFlow: Flow[Map[String, String], Person, NotUsed] =
  21. Flow[Map[String, String]]
  22. .map((rowMap: Map[String, String]) => {
  23. buildPersonModel(rowMap)
  24. })
  25. personFlow
  26. }
  27. //flow2
  28. def buildTvSerieFlow(): Flow[Map[String, String], TvSeries, NotUsed] = {
  29. val tvFlow: Flow[Map[String, String], TvSeries, NotUsed] =
  30. Flow[Map[String, String]]
  31. .map(row => {
  32. buildTvSerieModel(row)
  33. })
  34. tvFlow
  35. }
  36. //flow3
  37. def filterByTvSeriePrimaryTitleFlow(tvSeriePrimaryTitle: String): Flow[Map[String, String], TvSeries, NotUsed] = {
  38. val filterFlow: Flow[Map[String, String], TvSeries, NotUsed] = Flow[Map[String, String]]
  39. .filter((rows: Map[String, String]) => {
  40. rows.getOrElse(key = "primaryTitle", default = "")==tvSeriePrimaryTitle
  41. })
  42. .map(rowMap => {
  43. val tvSerie: TvSeries = buildTvSerieModel(tvSerieMap = rowMap)
  44. tvSerie
  45. })
  46. filterFlow
  47. }
  48. //flow4
  49. def filterByPersonIdFlow(nconst: String): Flow[Map[String, String], Person, NotUsed]={
  50. val personFilter: Flow[Map[String, String], Person, NotUsed]=
  51. Flow[Map[String, String]]
  52. .filter((rowMap:Map[String, String])=>{
  53. rowMap.getOrElse(key="nconst",default="")==nconst
  54. })
  55. .map(rowMap=>{
  56. buildPersonModel(personMap = rowMap)
  57. })
  58. personFilter
  59. }
  60. //flow5
  61. def filterByPersonNameFlow(personName: String): Flow[Map[String, String], Person, NotUsed] ={
  62. val personFilter: Flow[Map[String, String], Person, NotUsed] =
  63. Flow[Map[String, String]]
  64. .filter((rowMap: Map[String, String]) =>{
  65. rowMap.getOrElse(key = "primaryName", default = "")==personName
  66. })
  67. .map((rowMap: Map[String, String])=>{
  68. buildPersonModel(personMap = rowMap)
  69. })
  70. personFilter
  71. }
  72. //source building
  73. def buildSource(inputFile: File): Source[Map[String, String], NotUsed] = {
  74. var datasource: Source[Map[String, String], NotUsed] = null
  75. if (!fileExists(inputFile.getPath)) {
  76. return null
  77. }
  78. datasource = Source
  79. .single(inputFile)
  80. .flatMapConcat((filename: File) => {
  81. FileIO.fromPath(
  82. Paths.get(filename.getPath)
  83. )
  84. }
  85. )
  86. .via(Compression.gunzip())
  87. .via(CsvParsing.lineScanner(CsvParsing.Tab))
  88. .via(CsvToMap.toMapAsStrings())
  89. datasource
  90. }
  91. def buildAndValidateSource(inputFile: File): Source[Map[String, String], _] = {
  92. val source: Source[Map[String, String], _] = buildSource(inputFile = inputFile)
  93. if (source == null) {
  94. throw new FileNotFoundException(filename = inputFile.getPath)
  95. }
  96. source
  97. }
  98. //sinks building
  99. //sink1
  100. def buildTvSeriesSink(logger: Logger): Sink[TvSeries, Future[Done]] = {
  101. val tvSeriesSink : Sink[TvSeries, Future[Done]]= Sink
  102. .foreach((tvSerie: TvSeries)=> logger.info(s"${tvSerie.toString}"))
  103. tvSeriesSink
  104. }
  105. def buildAllTvSeriesSink(logger: Logger): Sink[TvSeries, Future[Done]] = {
  106. val tvSeriesSink: Sink[TvSeries, Future[Done]] = Sink
  107. .foreach((tvSerie: TvSeries)=>logger.info(s"${tvSerie.toString}"))
  108. tvSeriesSink
  109. }
  110. //sink2
  111. def buildAllPersonsSink(logger: Logger): Sink[Person,Future[Done]] = {
  112. val listPersonsSink: Sink[Person, Future[Done]]=
  113. Sink.foreach((person: Person)=>logger.info(s"${person.toString}"))
  114. listPersonsSink
  115. }
  116. //sink3
  117. def buildPersonSink(): Sink[Person, Future[Person]] = {
  118. Sink.head
  119. }
  120. }

Powered by TurnKey Linux.