Нет описания

AkkaStreamComponents.scala 2.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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.models.TvSeries
  10. import fr.natan.akkastreamfileprocessingapi.valitator.Validators.fileExists
  11. import java.io.File
  12. import java.nio.file.Paths
  13. import scala.concurrent.Future
  14. object AkkaStreamComponents {
  15. implicit val actor: ActorSystem = ActorSystem("AkkaStreamActor")
  16. private def convertToClassMovie(array: Array[String]): TvSeries = {
  17. val tvSerie: TvSeries = TvSeries(
  18. array(0),
  19. array(1),
  20. array(2),
  21. array(3),
  22. array(4),
  23. array(5),
  24. array(6),
  25. array(7),
  26. array(8))
  27. tvSerie
  28. }
  29. //flows
  30. def buildMovieFlow(movieID: String): Flow[String, TvSeries, NotUsed] = {
  31. val flow: Flow[String, TvSeries, NotUsed] =
  32. Flow[String].filter(rows => !rows.contains(movieID))
  33. .map(row => {
  34. val movie: Array[String] = row.split("\t")
  35. convertToClassMovie(movie)
  36. })
  37. flow
  38. }
  39. def buildfilterByMoviePrimaryTitleFlow(moviePrimaryTitle: String): Flow[String, TvSeries, NotUsed] = {
  40. val filterFlow: Flow[String, TvSeries, NotUsed] =
  41. Flow[String]
  42. .filter((rows: String) => {
  43. rows.contains(moviePrimaryTitle)
  44. })
  45. .map(row => {
  46. val movie: Array[String] = row.split("\t")
  47. convertToClassMovie(movie)
  48. })
  49. filterFlow
  50. }
  51. //source
  52. def buildSource(inputFile: File): Source[String, NotUsed] = {
  53. var source: Source[String, NotUsed] = null
  54. if (!fileExists(inputFile.getPath)) {
  55. return null
  56. }
  57. source = Source
  58. .single(inputFile)
  59. .flatMapConcat(
  60. (file: File) =>
  61. FileIO.fromPath(Paths.get(inputFile.getPath)
  62. )
  63. )
  64. .via(Compression.gunzip())
  65. .via(
  66. Framing.delimiter(ByteString("\n"), 4096)
  67. .map(byteString => byteString.utf8String)
  68. )
  69. source
  70. }
  71. def buildAndValidateSource(inputFile: File): Source[String, NotUsed] = {
  72. val source: Source[String, NotUsed] = buildSource(inputFile = inputFile)
  73. if (source == null) {
  74. throw new FileNotFoundException(filename = inputFile.getPath)
  75. }
  76. source
  77. }
  78. //sink
  79. def buildSink(logger: Logger): Sink[TvSeries, Future[Done]] = {
  80. val sink = Sink.foreach[TvSeries](
  81. (movie: TvSeries) => {
  82. logger.info(s"${movie.toString}")
  83. }
  84. )
  85. sink
  86. }
  87. }

Powered by TurnKey Linux.