No Description

AkkaStreamComponents.scala 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package fr.natan.akkastreamfileprocessingapi.service
  2. import akka.actor.ActorSystem
  3. import akka.stream.javadsl.Framing
  4. import akka.stream.scaladsl.{Compression, FileIO, Flow, Sink, Source}
  5. import akka.util.ByteString
  6. import akka.{Done, NotUsed}
  7. import com.typesafe.scalalogging.slf4j.Logger
  8. import fr.natan.akkastreamfileprocessingapi.businessexceptions.FileNotFoundException
  9. import fr.natan.akkastreamfileprocessingapi.datasource.Datasource.separator
  10. import fr.natan.akkastreamfileprocessingapi.models.{Person, TvSeries}
  11. import fr.natan.akkastreamfileprocessingapi.valitator.Validators.fileExists
  12. import java.io.File
  13. import java.nio.file.Paths
  14. import scala.concurrent.Future
  15. object AkkaStreamComponents {
  16. implicit val actor: ActorSystem = ActorSystem("AkkaStreamActor")
  17. private def convertToTvSerie(array: Array[String]): TvSeries = {
  18. val tvSerie: TvSeries = TvSeries(
  19. array(0),
  20. array(1),
  21. array(2),
  22. array(3),
  23. array(4),
  24. array(5),
  25. array(6),
  26. array(7),
  27. array(8))
  28. tvSerie
  29. }
  30. private def convertToPerson(array: Array[String]): Person ={
  31. Person(
  32. array(0),
  33. array(1),
  34. array(2),
  35. array(3),
  36. array(4).split(",").toList,
  37. array(5).split(",").toList,
  38. )
  39. }
  40. //flows
  41. def buildTvSerieFlow(movieID: String): Flow[String, TvSeries, NotUsed] = {
  42. val tvFlow: Flow[String, TvSeries, NotUsed] =
  43. Flow[String].filter(rows => !rows.contains(movieID))
  44. .map(row => {
  45. val movie: Array[String] = row.split(separator)
  46. convertToTvSerie(movie)
  47. })
  48. tvFlow
  49. }
  50. def buildPersonFlow(personID: String): Flow[String, Person, NotUsed]={
  51. val personFlow: Flow[String, Person, NotUsed] =
  52. Flow[String]
  53. .filterNot((rows: String)=>{
  54. rows.contains(personID)
  55. })
  56. .map((row: String)=>{
  57. convertToPerson(row.split(separator))
  58. })
  59. personFlow
  60. }
  61. def buildfilterByMoviePrimaryTitleFlow(moviePrimaryTitle: String): Flow[String, TvSeries, NotUsed] = {
  62. val filterFlow: Flow[String, TvSeries, NotUsed] =
  63. Flow[String]
  64. .filter((rows: String) => {
  65. rows.contains(moviePrimaryTitle)
  66. })
  67. .map(row => {
  68. val movie: Array[String] = row.split("\t")
  69. convertToTvSerie(movie)
  70. })
  71. filterFlow
  72. }
  73. //source
  74. def buildSource(inputFile: File): Source[String, NotUsed] = {
  75. var source: Source[String, NotUsed] = null
  76. if (!fileExists(inputFile.getPath)) {
  77. return null
  78. }
  79. source = Source
  80. .single(inputFile)
  81. .flatMapConcat(
  82. (file: File) =>
  83. FileIO.fromPath(Paths.get(inputFile.getPath)
  84. )
  85. )
  86. .via(Compression.gunzip())
  87. .via(
  88. Framing.delimiter(ByteString("\n"), 4096)
  89. .map(byteString => byteString.utf8String)
  90. )
  91. source
  92. }
  93. def buildAndValidateSource(inputFile: File): Source[String, NotUsed] = {
  94. val source: Source[String, NotUsed] = buildSource(inputFile = inputFile)
  95. if (source == null) {
  96. throw new FileNotFoundException(filename = inputFile.getPath)
  97. }
  98. source
  99. }
  100. //sink
  101. def buildTvSeriesSink(logger: Logger): Sink[TvSeries, Future[Done]] = {
  102. val tvSeriesSink : Sink[TvSeries, Future[Done]]= Sink.foreach[TvSeries](
  103. (movie: TvSeries) => {
  104. logger.info(s"${movie.toString}")
  105. }
  106. )
  107. tvSeriesSink
  108. }
  109. def buildPersonSink(logger: Logger): Sink[Person, Future[Done]] ={
  110. val personSink :Sink[Person, Future[Done]] = Sink
  111. .foreach[Person]((person: Person)=>{
  112. logger.info(s"${person.toString}")
  113. })
  114. personSink
  115. }
  116. }

Powered by TurnKey Linux.