설명 없음

AkkaStreamComponents.scala 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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 = "primaryName", default = "")==tvSeriePrimaryTitle
  41. })
  42. .map(rowMap => {
  43. val tvSerie: TvSeries = buildTvSerieModel(map = 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(map = 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(map = 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, CsvParsing.DoubleQuote, CsvParsing.DoubleQuote))
  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.foreach[TvSeries](
  102. (tvSerie: TvSeries) => {
  103. logger.info(s"${tvSerie.toString}")
  104. }
  105. )
  106. tvSeriesSink
  107. }
  108. //sink2
  109. def buildAllPersonsSink(logger: Logger): Sink[Person,Future[Done]] = {
  110. val listPersonsSink: Sink[Person, Future[Done]]=
  111. Sink.foreach[Person]((person: Person)=>logger.info(s"${person.toString}"))
  112. listPersonsSink
  113. }
  114. //sink3
  115. def buildPersonSink(): Sink[Person, Future[Person]] = {
  116. Sink.head
  117. }
  118. }

Powered by TurnKey Linux.